web-dev-qa-db-ja.com

現在の日付と時刻を取得し、「Hello」を含む各行の最後に追加する方法

次のようなファイルを含む次のファイル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"}'

何が欠けているのでしょうか?

19
Jack

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

28
Steve

gawk(および最新バージョンのmawk)には組み込みの 時間/日付関数 があり、外部ツールを使用する必要はありません。

gawk '/Hello/{print NR " - " $0 " - " strftime("%Y-%m-%d")}' party.txt
38
Alin
 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
3
Kent

このソリューションは、すべての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に保存します。

3
Jimilian

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

表示される理由0は、式date +"%Y-%m-%d"は、変数date0が定義されていないため)文字列"%Y-%m-%d" (どっちが 0は有効な数値ではないためです。

2
danfuzz

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 
0
dr-who

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
0
NeronLeVelu

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

0
Chris Koknat