リダイレクトされないように特定の行を除外[閉じる]

リダイレクトされないように特定の行を除外[閉じる]

次のスクリプトを実行するとします。

/a/b/c/script.sh >> abc.log

abc.logこれは、スクリプトの特定の行が必要な場合は、スクリプトのすべてのコンテンツ/実行がにリダイレクトされることを意味します。いいえにリダイレクトされますabc.log。どうすればいいですか?

答え1

/a/b/c/script.sh >> abc.log

このコマンドは、script.sh作成されたすべての出力を標準出力ストリームに添付されますabc.log

同様のパターンに一致する1つ以上の行を除外するには、grep -v次のようにします。

/a/b/c/script.sh | grep -v '<line-to-ignore>' >> abc.log

または、パターンを一致させます(たとえば、単語catで始まるすべての行)。

/a/b/c/script.sh | grep -vE '^cat' >> abc.log

grepフラグは-v一致を反転させることを意味するため、指定したパターンに一致するすべての行がフィルタリングされます。

答え2

ストリーム内の行を「削除」するなど、同様のツールを使用してsed出力を変更できます。script.sh行単位で削除するには:

/a/b/c/script.sh | sed -e '5d' >> abc.log

この例では、5行目が出力から削除されます。5任意の行番号に置き換えます。

/a/b/c/script.sh | sed -e '/<regex>/d' >> abc.log

正規表現に一致するすべての行は出力から削除されます。

答え3

行を選択できません。ストリーム全体(stdin、、、stdoutstderrより一般的にはこれらの標準ファイル記述子だけでなく、開いているすべてのファイル記述子))のみをリダイレクトできます。

出力ラインをクリーンアップするコマンドをパイピングして、必要なものをシミュレートできます。

$ echo -e "hello\nworld"   |  #write hello and world; one per line
tee >(grep hello >1.log) |  #select line matching hello and write it to 1.log
grep -v hello > 2.log  #select lines NOT matching hello and write them to 2.log

答え4

スクリプトの特定の行/コマンドの場合は、その出力を/dev/nullスクリプト内に送信できます。スクリプト内のコマンドは次のとおりです。

command > /dev/null

これにより出力が失われます。コンソールに表示するには、次のようstderrに送信できます。

command 2> `tty` 1>&2

関連情報