パイプラインで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 ***」に一致する2行を削除することを検討する必要がありました。
$ 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"}'