입력 파일 1은 다음과 같습니다.
dog 123 4335
cat 13123 23424
deer 2131 213132
bear 2313 21313
일치 항목에 대한 패턴 other file
( dog 123 4335
file2의 패턴과 유사)을 제공합니다.
행의 패턴을 일치시키고 dog 123 4335
일치하는 행이 없는 모든 행을 인쇄한 후 출력은 다음과 같습니다.
cat 13123 23424
deer 2131 213132
bear 2313 21313
주소 없이 패턴만 사용하는 경우 1s
줄을 일치시키고 인쇄하는 방법은 무엇입니까 ?
답변1
실제로는 다음을 사용할 수 있습니다.Aet3miirah의 답변대부분의 시간 그리고알렉세이의 답변라인 탐색에 적합합니다(또한 와 함께 사용할 수 있음 less
). OTOH, 저는 다른 접근 방식을 정말 좋아합니다(그 반대입니다).자일스의 대답):
sed -n '/dog 123 4335/,$p'
이 -n
플래그를 사용하여 호출하면 sed
처리하는 줄이 더 이상 기본적으로 인쇄되지 않습니다. 그런 다음 2 주소 형식을 사용합니다. 이는 일치하는 줄부터 시작하여 /dog 123 4335/
파일 끝까지(로 표시 ) 명령을 적용한다는 의미입니다 $
. 문제의 명령은 p
현재 줄을 인쇄한다는 것입니다. 따라서 이는 "일치하는 줄부터 /dog 123 4335/
끝까지 모든 줄을 인쇄합니다"를 의미합니다.
답변2
파일이 상당히 짧은 경우 grep
다음과 같이 작동할 수 있습니다.
grep -A5000 -m1 -e 'dog 123 4335' animals.txt
5000은 첫 번째 일치 항목이 발견되어 다음 5000줄과 함께 출력되기 때문에 "상당히 짧다"고 추측한 것입니다 grep
(파일에는 그렇게 많은 줄이 필요하지 않습니다). 일치 자체를 원하지 않으면 잘라야 합니다.
grep -A5000 -m1 -e 'dog 123 4335' animals.txt | tail -n+2
첫 번째 일치를 원하지 않고 마지막 일치를 구분 기호로 사용하려면 다음 명령을 사용할 수 있습니다.
tac animals.txt | sed -e '/dog 123 4335/q' | tac
행은 animals.txt
행을 포함하여 행의 역순으로 읽고 출력된 다음 dog 123 4335
다시 역순으로 되어 올바른 순서로 복원됩니다.
마찬가지로, 결과에 일치 항목이 필요하지 않으면 tail을 추가하세요. (종료하기 전에 버퍼가 삭제되도록 sed 표현식을 복잡하게 만들 수도 있습니다.)
답변3
GNU를 사용하여 전체 줄을 패턴과 일치시키려고 한다고 가정하면 sed
다음과 같이 작동합니다.
sed -n '/^dog 123 4335$/ { :a; n; p; ba; }' infile
표준 동등:
sed -ne '/^dog 123 4335$/{:a' -e 'n;p;ba' -e '}' infile
다음을 입력 ( infile
):
cat 13123 23424
deer 2131 213132
bear 2313 21313
dog 123 4335
cat 13123 23424
deer 2131 213132
bear 2313 21313
출력은 다음과 같습니다
cat 13123 23424
deer 2131 213132
bear 2313 21313
설명하다:
/^dog 123 4335$/
원하는 패턴을 검색하세요.:a; n; p; ba;
n
p
입력( )에서 새 줄을 가져와 이를 인쇄( )한 다음 다시 레이블 a 로 분기하는 루프입니다:a; ...; ba;
.
고쳐 쓰다
다음은 귀하의 요구에 더 가까운 답변입니다(예: file2의 패턴, file1의 grep).
tail -n +$(( 1 + $(grep -m1 -n -f file2 file1 | cut -d: -f1) )) file1
포함된 grep 및 cut은 file2에서 패턴이 포함된 첫 번째 줄을 찾습니다. 이 줄 번호는 패턴이 있는 줄을 건너뛰기 위해 tail에 1을 더한 값으로 전달됩니다.
첫 번째 게임 대신 마지막 게임부터 시작하고 싶다면 다음과 같이 하세요.
tail -n +$(( 1 + $(grep -n -f file2 file1 | tail -n1 | cut -d: -f1) )) file1
tail의 모든 버전이 더하기 기호를 지원하는 것은 아닙니다.
답변4
$ more +/"dog 123 4335" file1