長いリストフィールドを抽出する方法は?

長いリストフィールドを抽出する方法は?

シェルスクリプトからファイルのアクセス日を抽出したいと思います。次のスクリプトを書いてみましたが、うまくいきません。私がエコーするとき訪問日、出力は「従業員」です。

file=$1
accessday=$(ls -lu $file | cut -d ' ' -f 6)

答え1

解析されないls

これは職業ですstat

人間が読める形式で最後のアクセス時間を取得するには、次のようにします。

stat -c '%x' file.txt

エポックから経過した時間(秒):

stat -c '%X' file.txt

答え2

ls -lu一般的な出力を見ると

-rw-r--r--  1 someuser  somegroup  74 Mar 29 05:21 filename

グループ名の前には合計5つの空白文字があることがわかります。したがって、コマンドで指定したフィールド6は、グループcut(あなたの場合は「staff」)を返します。

また、訪問日は表記上6番ではなく7番フィールドになります。

1つの解決策はを使用することですawk。これは、デフォルトでフィールド区切り文字の複数の発生を処理するためです。

accessday=$(ls -lu $file | awk '{print $7}')

答え3

あなたの質問に従ってstatを使用して出力を正規化し、希望の日付のみを表示するように切り捨てます。

stat -c '%x' FILENAME | cut -c 9,10

答え4

ls次の出力を解析します。難しく、常に可能ではない。これはタイムスタンプを抽出したい場合に必要な代替方法ですが、(唯一の移植可能な方法:すべてのシステムにコマンドがあるわけではありませんstat)、人間が読めるタイムスタンプを取得します。機械が読める形式に変換するのが難しい。少なくとも難しい部分を修正してください。ユーザーとグループのフィールドを省略する転送-o-gオプション(一部のシステムでは、これらのフィールドにスペースが含まれているため、出力では区別できない可能性がありますls)。その後、タイムスタンプはフィールド4-6(1から始まり番号付き)を占めます。

変数拡張の二重引用符を忘れないでください。

access_time=$(ls -dlogu -- "$file" | awk '1 {print $4, $5, $6}')

その月の日付が必要な場合は、過去6ヶ月以内のタイムスタンプであるかどうかに応じて、2つの出力形式を区別する必要があります。安定した出力フォーマットのためにロケールをCに設定します。この形式では、その月の日付は常に2番目のタイムスタンプフィールドです。

access_day=$(ls -dlogu -- "$file" | awk '1 {print $5}')

関連情報