BMS, Movie, Illustrations, Programming

[Linux] Bashで標準出力の行頭に日付を追加したい

12345 みたいなデータから、 YYYY/MM/DD HH:mm:ss,12345 みたいなデータを生成したい。

cronでデータを取ってきて、grep -oPで適当なデータを抽出し、CSVの末尾に1行追加したいときの話。

方法1. 変数を使う(簡単!)

kuro@ubuntu:~$ date=`date +"%Y/%m/%d %T"`
kuro@ubuntu:~$ contents=12345
kuro@ubuntu:~$ echo "$date,$contents"
2017/09/21 02:25:26,12345

方法2. echoとバッククオートを使う

最後のcatは標準入力を受け取っています。

kuro@ubuntu:~$ echo 12345 | echo "`date +\'%Y/%m/%d %T\'`,`cat`"
2017/09/21 02:43:48,12345

似たような方法が他にも何通りかあります。お好きなものをご利用ください。

kuro@ubuntu:~$ echo 12345 | echo "$(date +'%Y/%m/%d %T'),$(cat)"
2017/09/21 02:58:53,12345
kuro@ubuntu:~$ echo 12345 | paste -d , <(date +"%Y/%m/%d %T") <(cat)
2017/09/21 02:59:21,12345

方法3. awkを使う方法

こちらを参考に。

http://qiita.com/nii_yan/items/2ee949d0e48da11eed17

kuro@ubuntu:~$ echo 12345 | awk '{ "date +\"%Y/%m/%d %T\"" | getline var; print var "," $0 }'
2017/09/21 02:51:18,12345

この方法だと複数行にも対応できます。

kuro@ubuntu:~$ cat contents.txt 
123
456
789
kuro@ubuntu:~$ cat contents.txt | awk '{ "date +\"%Y/%m/%d %T\"" | getline var; print var "," $0 }'
2017/09/21 03:12:02,123
2017/09/21 03:12:02,456
2017/09/21 03:12:02,789

bashは色々な方法があって面白いですね。bash初心者なのでもっと簡単な方法があるかも。