다음과 유사한 텍스트 파일이 있습니다.
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
일치하지 않는 줄 다음에 중지합니다 (따라서 시작 줄과 같은 줄이 될 수 없습니다). 시작됩니다A
line 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을 사용하여 원하는 문자열이 있는 줄을 가져옵니다( 줄 번호를 출력하고 첫 번째 일치 후 검색을 중지하려면).cut
tail
-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 +k
tail을 k 줄부터 인쇄하게 됩니다. 전체 명령은 다음과 같습니다.
tail -n +`grep -n -m 1 "somestring" filename.txt | cut -f1 -d:` filename.txt
대신 및 대신 somestring
사용할 때까지 라인을 출력합니다 . 두 문자열을 결합하여 한 문자열에서 다른 문자열까지 줄을 가져올 수도 있습니다.head
tail
-n -#
-n +#
답변4
아래 코드를 시도해 보세요 -
sed -n '6,$p' infile