希望の出力を得るために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つのグループを印刷してにリンクします/
。