23

party.txt私は次のようなものを含む次のファイルを持っています:

Hello Jacky
Hello Peter
Bye Johnson
Hello Willy
Bye Johnny
Hello Mary
Hello Wendy

を使用しgrep helloてコンテンツをキャプチャしましたが、を使用しprint date +"%Y-%m-%d'て追加すると、それができず、01行あたりの数が多くなります。

cat party.txt | grep Hello | awk '{ print date +"%Y-%m-%d"}'

何が欠けている可能性がありますか?

4

8 に答える 8

40

gawk(および最近のバージョンのmawk)には時刻/日付関数が組み込まれているため、そこで外部ツールを使用する必要はありません。

gawk '/Hello/{print NR " - " $0 " - " strftime("%Y-%m-%d")}' party.txt
于 2013-10-23T12:14:15.097 に答える
33

使用する1つの方法awk

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開始時にのみ設定されるため、コマンドの実行に時間がかかっても変更されないことに注意してください。

于 2012-09-11T09:53:00.253 に答える
4
 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
于 2012-09-11T12:20:44.720 に答える
4

このソリューションは、どの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ます。

于 2016-12-14T09:20:54.913 に答える
3

直接の質問に答えるには、それdateが外部コマンドであるため、awkの外部で呼び出して変数として渡すか(他の回答の1つが示すように)、から呼び出す必要があります。system()ビルトインまたはパイプのいずれかを使用するシステムコマンドとしてawk内で(他の回答の別の1つが示すように)。

表示さ0れる理由は、式date +"%Y-%m-%d"が変数の数値date0定義されていないため)を文字列の数値"%Y-%m-%d"0有効な数値ではないため)に追加するものとして解釈されているためです。

于 2012-09-11T21:46:05.970 に答える
0

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処理前に改行を削除し、後で追加し直します

  • -ePerlコードを実行します

  • $_現在の行です

  • -MPOSIXPOSIXモジュールをロードします。strftime

  • localtime与えられたフォーマットで時間をstrftime印刷します%Y-%m-%d

于 2015-10-01T16:52:08.460 に答える
0

posix sed(およびsedのtime関数が欠落しているためのサブシェル)の使用

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
于 2016-11-10T08:06:26.320 に答える
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 
于 2019-09-16T20:56:05.900 に答える