![문맥 문구가 포함되지 않은 줄을 파일에서 검색합니다.](https://linux55.com/image/73458/%EB%AC%B8%EB%A7%A5%20%EB%AC%B8%EA%B5%AC%EA%B0%80%20%ED%8F%AC%ED%95%A8%EB%90%98%EC%A7%80%20%EC%95%8A%EC%9D%80%20%EC%A4%84%EC%9D%84%20%ED%8C%8C%EC%9D%BC%EC%97%90%EC%84%9C%20%EA%B2%80%EC%83%89%ED%95%A9%EB%8B%88%EB%8B%A4..png)
키워드와 여러 줄의 숫자가 포함된 항목이 많은 파일이 있습니다. 특정 유형의 항목을 필터링하고 싶기 때문에 항목 derp 뒤에 세 줄이 오면 grep -v -A3 derp filename
파일 이름에서 derp 유형이 아닌 모든 항목을 가져오고 싶습니다. 문제는 비호환성인 것 같습니다 -v
. -A
두 플래그를 모두 사용하면 -v
무시됩니다. 내가 또 무엇을 할 수 있나요? 파일은 다음과 같습니다.
SOURCE: pI < min 45 16 0 7.4871483836177132E-004 5.1628324610858206E-004 -1.826383220714803 -9.4293105782888549E-004 -6.8875048798939895E-002 -0.2196057448134437 -6.6270591049115615E-003 SOURCE: pI < min 45 17 0 7.1266687952112871E-004 5.1628324610858206E-004 -2.169039713847648 -1.1198388644036935E-003 -8.2240618017566103E-002 -9.0412967200093102E-005 -7.5453919169102962E-003 SOURCE: pI < min 45 18 0 7.0936181176839061E-004 5.1628324610858206E-004 -2.589392543137075 -1.3368599876201657E-003 -9.8187643312659903E-002 -1.1762198384731523E-005 -9.4417591779528513E-003
이는 수천 줄에 걸쳐 비슷한 방식으로 계속됩니다. 때때로 항목이 가 아닌 다른 것으로 시작되는 경우가 있습니다 SOURCE: pI < min
. 제가 찾고 싶은 것은 바로 이 항목들입니다. 파일 크기는 약 50Mb입니다.
답변1
유용한 것을 찾았습니다.
grep -A3 derp filename | diff - filename
답변2
다른 방향에서 해보는 건 어떨까요?
sed '/pattern/,+3d' input_file
또는 없는 경우 gnu sed
:
sed '/pattern/ {N;N;N;d;} input_file
패턴을 포함하는 줄과 해당 줄 다음의 3줄을 제외한 모든 텍스트가 표시됩니다.
또는 파일을 그 자리에서 편집하려면 다음을 수행하세요.
sed -i '/pattern/,+3d' input_file
-i
귀하의 제품이 지원하지 않는 경우 sed
:
sed '/pattern/ {N;N;N;d;} inputfile > output_file
mv output_file input_file
기본적으로 원하는 작업을 수행해야 합니다. 즉, 파일을 포함해야 합니다.
cat
dog
dog
dog
horse
이것이 내 패턴이라면 horse
결과는 하나만 얻을 것입니다.cat
답변3
필요하지 않은 다른 항목이 모두 숫자가 아니라고 가정하면 를 사용하여 해당 항목의 목록을 작성할 수 있습니다 grep -v '^([0-9-]+|SOURCE:)' filename
. 이렇게 하면 일치하는 줄 전체가 출력되므로 추가 처리가 필요합니다.
모두 단어 뒤에 콜론이 오는 패턴을 따르는 경우 를 사용할 수 있습니다 awk -F: '!/^([0-9]+|SOURCE:)/ { print $1}'
.
목록이 있으면 이를 사용하여 모든 항목과 일치하는 정규식을 작성한 다음 sed
일치하는 항목 중 하나가 발견될 때마다 4개의 행을 삭제하는 데 사용할 수 있습니다.
예를 들어:
LIST=$(awk -F: '!/^([0-9-]+|SOURCE:)/ { print $1}' filename | sort -u)
RE=$(echo $LIST | sed -e 's/ /|/g')
sed -r -e "s/^($RE):/,4 d" filename
일부 항목을 제거하는 등 정규식을 작성하기 전에 목록에 대한 추가 처리가 필요한 경우 다음을 수행할 수 있습니다.
RE=$(echo "$LIST" | egrep -v '^(FOO|BAR)$' | xargs echo | sed -e 's/ /|/g')
이번에는 "$LIST" 주위에 큰따옴표가 있음에 유의하세요. 이는 egrep에서 사용하는 줄 바꿈을 유지합니다(이것이 xargs echo
한 줄의 모든 목록 항목을 가져오기 위해 나중에 파이프 해야 하는 이유입니다 sed
).