파이프라인에서 일치하는 단어가 있는 줄 삭제

파이프라인에서 일치하는 단어가 있는 줄 삭제

파이프라인에서 xlsxgrep을 사용하고 있지만 무시되는 대신 stdout에 경고가 나타납니다. 파이프 자체에서 해당 라인을 제거하는 방법을 배우고 싶습니다.

내 명령:

$ xlsxgrep -riH "${SEARCHTERM}" "${DIR}" >> "${OUTPUTFOLDER}/xlsxgrep-output.txt"
$ awk -F: '{print "\x27"$1"\x27"}' "${OUTPUTFOLDER}/xlsxgrep-output.txt" |
    awk '!x[$0]++' |
    tee "${OUTPUTFOLDER}/xlsxgrep-output-filename.txt" |
    xargs -I {} cp --backup=t {} "${OUTPUTFOLDER}/xlsxgrep-output/"

파이프라인의 오류 라인:

WARNING *** file size (36373) not 512 + multiple of sector size (512)
WARNING *** OLE2 inconsistency: SSCS size is 0 but SSAT size is non-zero

다음을 사용하여 sed에서 "WARNING ***"과 일치하는 두 줄을 제거하는 것을 고려해야 했습니다.

$ sed '/^WARNING \*\*\*/d' "${OUTPUTFOLDER}/xlsxgrep-output.txt"

산출:

'test.xlsx'
'test2.xlsx'

하지만 파이프라인에 동일한 명령을 추가하면 작동하지 않습니다.

$ awk -F: '{print "\x27"$1"\x27"}' "${OUTPUTFOLDER}/xlsxgrep-output.txt" |
    awk '!x[$0]++' |
    sed '/^WARNING \*\*\*/d'

산출:

'test.xlsx'
'WARNING *** file size (36373) not 512 + multiple of sector size (512)'
'WARNING *** OLE2 inconsistency: SSCS size is 0 but SSAT size is non-zero'
'test2.xlsx'

예상 출력:

'test.xlsx'
'test2.xlsx'

내 명령이 올바른 방식으로 작동하지 않는 이유는 무엇입니까?

답변1

이러한 경고가 stderr 대신 stdout에 인쇄되는 것이 이상해 보이지만 이 도구에 대한 경험이 없으므로 xlsgrep이것이 예상되는지 또는 이를 제어할 수 있는 옵션이 있는지는 알 수 없습니다.

어쨌든, 귀하의 sed실패는 *정규식의 특수 문자로 인해 발생합니다. 이는 "이전 문자가 0회 이상 반복됨"을 의미합니다. 귀하의 경우에는 *그 뒤에 공백이 있으므로 *"0개 이상의 공백"을 의미합니다. 후속 설명이 무엇인지 잘 모르겠습니다 *. GNU에서는 sed오류가 발생하지만 busybox는 sed이를 단일 *.

어쨌든 올바른 방법은 탈출하는 것입니다 *.

sed '/^WARNING \*\*\*/d'

또한 awk명령이 '줄 시작 부분에 문자를 삽입한다는 점에 유의하세요.

awk -F: '{print "\x27"$1"\x27"}' 

이는 이것이 WARNING더 이상 첫 번째 일이 아니라는 것을 의미합니다.

$ echo WARNING | awk -F: '{print "\x27"$1"\x27"}' 
'WARNING'

이제 문자를 일치시켜 이를 고려해야 'WARNING'합니다 .sed

sed '/^.WARNING \*\*\*/d'

또는 작은따옴표를 일치시켜:

sed "/^'WARNING \*\*\*/d"

awk또는 원래 입력 내용과 내용에 따라 다른 것일 수도 있습니다 .$1'{print "\x27"$1"\x27"}'

관련 정보