awkを使用した日付の印刷と編集

awkを使用した日付の印刷と編集

希望の出力を得るために1行のコマンドを探しています。プレーンテキストは次のとおりです。 "test_list_20160915_bla.log" 目的の出力: "2016/09/15"

2つのawkコマンドを使用してこれを行うことができます(コマンドは年だけを印刷することを知っています。これは目的だけです)。

echo "test_list_20160915_bla.log" |awk -F_ '$3 ~ /[0-9]/ {print $3}' |awk 'BEGIN {OFS="/"} {print substr($1,1,4)}'

しかし、1コマンドでどのように使用しますか? awkは正しいツールですか?おそらくsedも同じことができます。しかし、私はawkに慣れています。

提供されたソリューションにはいくつかの問題があります。時々 "test_20161205145213.log"のようなファイルがあります。 sed コマンドを使用すると、「2051/45/21」のような結果が出力されますが、これはあまり良くありません。いくつか試してみましたがわかりません。

これを切り替えました

 sed -r 's!^.*_([0-9]{4})([0-9]{2})([0-9]{2})_.*$!\1/\2/\3!'

到着

 sed -r 's!^.*(20[0-9]{2})([0-9]{2})([0-9]{2}).*$!\1/\2/\3!'

これはエラー出力を2時間タイムスタンプに制限します。むしろファイル名を完全に無視して、その中にあるタイムスタンプだけを探してみたいと思います。

タイムスタンプはyyymmdd_hhmmssまたはyyymmddhhmmssです。 yyyy/mm/dd 部分のみが必要です。問題は、固定長やフィールド区切り文字がないことです。

ベストアンサー1

awk同じスクリプトでスライスとダイシングを実行できます。

echo "test_list_20160915_bla.log" |
    awk -F_ '$3 ~ /^[1-9][0-9]*$/ { print substr($3,1,4) "/" substr($3,5,2) "/" substr($3,7,2) }'

ここでは、3番目の「_」で区切られたフィールドから、年、月、日の数値グループを抽出して出力します。

または、sed追加の要件を満たすことができるを使用してください。

(
    echo "test_list_20160915_bla.log"
    echo "test_20161205145213.log"
) |
    sed -r 's!^.*_([0-9]{4})([0-9]{2})([0-9]{2}).*$!\1/\2/\3!'

ここでは、正規表現を使用して年、月、日の3桁のグループをキャプチャし、残りはすべて捨ててから、3つのグループを印刷してにリンクします/

おすすめ記事