Unixスクリプトで日付と時刻を切り取る方法

Unixスクリプトで日付と時刻を切り取る方法

cutや他の同様のコマンドを使用して日付と時刻を取得する方法を尋ねたい。デフォルトでは、次$lineから検索しますfor loop

for line in $(cat $file);
do
   getdatetime=$(echo $line | cut -f4 -d,)
done

サンプル値は次のとおりです$line

883427446627317909,1114259,1573178423,2019-11-08 02:00:23,RD,4.7,0,351442429

ファイルには、$file例に似た複数行が含まれています$line

予想される値は次のとおりですgetdatetime

2019-11-08 02:00:23

しかし、日付だけがわかります。

2019-11-08

cut日付と時刻を抽出する1行のコマンドはありますか? forループの構造を保存する必要があります。ありがとうございます。

ベストアンサー1

引用符のないコマンド置換を繰り返すと、$(cat $file)すべてのコマンドを繰り返します。性格cat $file単語は、スペース(デフォルトではスペース、タブ、または改行)で区切られた任意の項目にすることができます。これは$file行の1つに対して

883427446627317909,1114259,1573178423,2019-11-08 02:00:23,RD,4.7,0,351442429

883427446627317909,1114259,1573178423,2019-11-082つの単語が得られます02:00:23,RD,4.7,0,351442429(つまり、ループはこの行に対して2回繰り返されます)。つまり、行の2019-11-08最初の繰り返しと02番目の繰り返しが行われます。

解決策はいいえコマンド置換を引用すると、ループが繰り返されます。一度ファイルの内容全体を読みます$line。解決策はいいえIFS次のように改行文字に設定してください。優雅ではないcut(繰り返しごとに1回呼び出す必要があります)。

代わりに、目的のデータを解析して一度の呼び出しで読みますcut

while IFS= read -r datetime; do
    # use "$datetime" here
done < <( cut -d, -f4 "$file" )

whileこれはプロセス置換を使用してループから読み取る入力ストリームを生成します。このストリームのデータには、ファイル名がカンマで区切られた4番目のフィールドが含まれています$file

または、whileサブシェルでループを使用してください。

cut -d, -f4 "$file" |
while IFS= read -r datetime; do
    # use "$datetime" here
done

使用すると、awk廃棄物がよりきれいになります(あなたは必要何らかの理由で日付/時刻値をシェル変数として使用する場合):

awk -F , '{ datetime = $4; ... more code here using the datetime variable }' "$file"

関連読書:

おすすめ記事