次のようなファイルを含む次のファイルparty.txt
があります。
Hello Jacky
Hello Peter
Bye Johnson
Hello Willy
Bye Johnny
Hello Mary
Hello Wendy
grep hello
を使用してコンテンツをキャプチャしましたが、print date +"%Y-%m-%d'
を使用してそれに追加すると、できません。1行ごとに多くの0
を取得します。
cat party.txt | grep Hello | awk '{ print date +"%Y-%m-%d"}'
何が欠けているのでしょうか?
awk
を使用する1つの方法:
awk -v date="$(date +"%Y-%m-%d %r")" '/Hello/ { print $0, date}' party.txt
結果:
Hello Jacky 2012-09-11 07:55:51 PM
Hello Peter 2012-09-11 07:55:51 PM
Hello Willy 2012-09-11 07:55:51 PM
Hello Mary 2012-09-11 07:55:51 PM
Hello Wendy 2012-09-11 07:55:51 PM
日付値はawk
の開始時にのみ設定されるため、コマンドの実行に時間がかかっても変更されないことに注意してください。
gawk(および最新バージョンのmawk)には組み込みの 時間/日付関数 があり、外部ツールを使用する必要はありません。
gawk '/Hello/{print NR " - " $0 " - " strftime("%Y-%m-%d")}' party.txt
awk 'BEGIN{"date +'%Y-%m-%d'"|getline d;}/Hello/{print $0,d}' file
あなたに与えます:
Hello Jacky 2012-09-11
Hello Peter 2012-09-11
Hello Willy 2012-09-11
Hello Mary 2012-09-11
Hello Wendy 2012-09-11
このソリューションは、すべてのawkで動作するはずです。
_awk '/Hello/ {cmd="(date +'%H:%M:%S')"; cmd | getline d; print d,$0; close(cmd)}' party.txt
_
魔法はclose(cmd)
ステートメントで発生します。 awk
が毎回cmd
を強制的に実行するため、日付は毎回実際の日付になります。
_cmd | get line d
_はcmd
から出力を読み取り、d
に保存します。
直接の質問に答えるには、date
が外部コマンドであるため、awkの外部で呼び出して変数として渡す必要があります(他の回答の1つが示すように) )、またはsystem()
ビルトインまたはパイプを使用してシステムコマンドとしてawk内から呼び出します(他の回答の1つが示すように)。
表示される理由0
は、式date +"%Y-%m-%d"
は、変数date
(0
が定義されていないため)文字列"%Y-%m-%d"
(どっちが 0
は有効な数値ではないためです。
Gawkのみ:
$ gawk '/Hello/ {print $0, strftime("%Y-%m-%d");}' party.txt
Hello Jacky 2019-09-17
Hello Peter 2019-09-17
Hello Willy 2019-09-17
Hello Mary 2019-09-17
Hello Wendy 2019-09-17
posix sed(およびsedに時間関数がないためサブシェル)を使用する
sed -n "/^Hello/ s/$/ $( date +'%Y-%m-%d' )/p" party.txt
帰る
Hello Jacky 2016-11-10
Hello Peter 2016-11-10
Hello Willy 2016-11-10
Hello Mary 2016-11-10
Hello Wendy 2016-11-10
Perlの使用を受け入れている場合:
Perl -MPOSIX -lne 'if (/Hello/){ print "$_ " . strftime "%Y-%m-%d",localtime }' party.txt
この出力を生成します
Hello Jacky 2015-10-01
Hello Peter 2015-10-01
Hello Willy 2015-10-01
Hello Mary 2015-10-01
Hello Wendy 2015-10-01
仕組みは次のとおりです。
-n
入力ファイルのすべての行をループし、各行を自動的に印刷しません
-l
は処理の前に改行を削除し、その後それらを再び追加します
-e
Perlコードを実行します
$_
は現在の行です
-MPOSIX
は、strftime
を含むPOSIXモジュールをロードします
localtime
およびstrftime
は、与えられた形式%Y-%m-%d