次のスクリプトを実行するとします。
/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
、、、stdout
(stderr
より一般的にはこれらの標準ファイル記述子だけでなく、開いているすべてのファイル記述子))のみをリダイレクトできます。
出力ラインをクリーンアップするコマンドをパイピングして、必要なものをシミュレートできます。
$ 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