Linux - 특정 줄부터 파일 끝까지 "grep"

Linux - 특정 줄부터 파일 끝까지 "grep"

다음과 유사한 텍스트 파일이 있습니다.

line 1
line 2A
line 3
line 4A
line 5

"라인 2A"에서 파일 끝까지 "grep"하고 싶습니다. 다음과 같습니다.

cat file.txt|some_grep "line 2A"

또한 "라인 2A"에서 "A"가 포함된 다음 라인으로 "grep"하고 싶습니다.

cat file.txt| some_grep "A"

나는 이것을 인쇄하고 싶습니다 :

line 2A
line 3
line 4A

이를 달성하는 데 도움이 되는 명령은 무엇입니까?

답변1

(댓글에서 확장됨)

awk이 요구 사항에 완벽하게 일치하는 라인의 '범위'를 선택할 수 있는 기능이 있습니다.GNU-awk(gawk) 매뉴얼에 설명되어 있습니다.. (이 기능은 다른 제품에서도 작동 awk하지만 gawk매뉴얼은 연결하기 쉽습니다.)

awk '/line 2A/,0'조건이 결코 참이 아니기 때문에 일치하는 첫 번째 줄부터 시작하여 line 2A입력이 끝날 때까지 계속되는 줄을 인쇄합니다.0

awk '/line 2A/,/A/&&!/line 2A/'일치하는 줄로 인쇄를 시작 하고 일치 하지만 line 2A일치하지 않는 줄 다음에 중지합니다 (따라서 시작 줄과 같은 줄이 될 수 없습니다). 시작됩니다Aline 2A다시후속 line 2A등등; 이를 방지하려면 약간 더 복잡한 방법이 있습니다.

2중지 줄에 항상 이전 이외의 문자가 있는 경우 2 이외의 문자와 일치하는 줄 뒤에 A가 따라오는 것으로 A단순화할 수 있습니다 . 예를 들어 임의의 단일에서 중지하는 등의 변형을 원할 수 있습니다. awk '/line 2A/,/[^2]A/'숫자-A는 2A와 다르지만 다른 것과는 다릅니다 WHAT. 그 경우 중지 조건은 다음과 같을 수 있습니다 ,/line [013-9]A/.

답변2

"라인 2A"부터 파일 끝까지 "grep"하고 싶습니다.

sed -n '/2A/,$p'
  • -n : sed기본 출력을 억제합니다.
  • /2A/ : "2A"를 포함하는 첫 번째 라인의 출력 라인
  • $ : 파일 끝까지

"라인 2A"에서 "A"가 포함된 다음 라인으로 "grep"하고 싶습니다.

sed -n '/2A/,/A/p'
  • /A/ : 줄에 "A"가 포함될 때까지 출력

"A"가 포함된 첫 번째 줄부터 다음 줄까지 "grep"하고 싶습니다.

printf "/A\n.+1,/A/p\nq" | ed -s

$ > foo echo "line 1
line 2A
line 3
line 4A
line 5"

$ sed -n '/2A/,$p' foo
line 2A
line 3
line 4A
line 5

$ sed -n '/2A/,/A/p' foo
line 2A
line 3
line 4A

$ printf "/A\n.+1,/A/p\nq" | ed -s foo
line 2A
line 3
line 4A

답변3

내 생각에 가장 좋은 방법은 and grep와 함께 사용하는 것입니다 . 먼저 grep을 사용하여 원하는 문자열이 있는 줄을 가져옵니다( 줄 번호를 출력하고 첫 번째 일치 후 검색을 중지하려면).cuttail-n-m 1

grep -n -m 1 "somestring" filename.txt

그러면 줄 번호와 문자열 자체가 출력됩니다. 문자열을 잘라내려면 cut( -f1: 첫 번째 필드를 출력하고 -d:":"를 구분 기호로 사용)을 사용합니다.

grep -n -m 1 "somestring" filename.txt | cut -f1 -d:

다음으로 이 명령의 출력을 tail의 매개변수로 사용합니다. 일반적으로 tail은 마지막 k 줄을 인쇄하지만 를 사용하면 -n +ktail을 k 줄부터 인쇄하게 됩니다. 전체 명령은 다음과 같습니다.

tail -n +`grep -n -m 1 "somestring" filename.txt | cut -f1 -d:` filename.txt

대신 및 대신 somestring사용할 때까지 라인을 출력합니다 . 두 문자열을 결합하여 한 문자열에서 다른 문자열까지 줄을 가져올 수도 있습니다.headtail-n -#-n +#

답변4

아래 코드를 시도해 보세요 -

sed -n '6,$p' infile

관련 정보