Linuxファイルの2列(アクセス日と変更日)のAND演算

Linuxファイルの2列(アクセス日と変更日)のAND演算

「ディレクトリ、ファイル名、権限、グループおよび所有者、サイズ、最後のアクセス日、最後の変更日、最後の変更日」を含む数百万のレコードファイルがあります。最後の行(ファイル)アクセス日と最後の変更日を取得する必要があります。 2012年以下です。

例:

23 8 drwx------ 16 userid grpid 2048 2009-06-25 20:42 2011-03-03 17:27 2011-03-03 17:27 /path/dir
66738 8 drwx--S--- 3 userid grpid 1024 2010-03-05 11:49 2015-07-07 17:48 2010-03-05 11:49 /path/dir/dir2
90354 8 -rw-r----- 1 userid grpid 65536 2016-05-25 15:28 2008-05-22 12:00 2014-03-05 16:00 /path/dir/dir2/file1
89743 8 -rw-r----- 1 userid grpid 65536 2016-05-25 15:28 2008-05-22 12:00 2010-03-05 16:00 /path/dir/dir2/file2

答え1

最も短いawkコードは次のとおりです。

awk '$3 ~ /^-/ && $8 < "2013" && $10 < "2013"' file

これはテストに合格したレコードにデフォルトのジョブ(印刷)を使用します。
また、次の語彙順序を活用します。

  • "2012-12-31" < "2013"本当です。
  • "2013-01-01" < "2013"

答え2

出力から一致する行を取得するには、入力例を修正してください。

$ cat ip.txt 
23 8 drwx------ 16 userid grpid 2048 2009-06-25 20:42 2011-03-03 17:27 2011-03-03 17:27 /path/dir
66738 8 -rwx--S--- 3 userid grpid 1024 2010-03-05 11:49 2011-07-07 17:48 2010-03-05 11:49 /path/dir/dir2
90354 8 -rw-r----- 1 userid grpid 65536 2016-05-25 15:28 2008-05-22 12:00 2014-03-05 16:00 /path/dir/dir2/file1
89743 8 -rw-r----- 1 userid grpid 65536 2016-05-25 15:28 2008-05-22 12:00 2010-03-05 16:00 /path/dir/dir2/file2

$ grep -P '^(\S+\s+){2}-(?1){5}(\d\d(0\d|1[0-2]))(?1){2}(?2)' ip.txt 
66738 8 -rwx--S--- 3 userid grpid 1024 2010-03-05 11:49 2011-07-07 17:48 2010-03-05 11:49 /path/dir/dir2
  • (\S+\s+)スペース以外のテキストの後にスペースが続きます。{5}または{2}何度も繰り返してください。
  • \d\d(0\d|1[0-2])2012またはそれ以前(年の最初の2桁がを超えないと仮定20
  • (?1)指名して(\S+\s+)また(?2)指す(\d\d(0\d|1[0-2]))


perl解決策は次のようになります。グレンの答え

$ perl -ae 'print if $F[2] =~ /^-/ && $F[7] < 2013 && $F[9] < 2013' ip.txt 
66738 8 -rwx--S--- 3 userid grpid 1024 2010-03-05 11:49 2011-07-07 17:48 2010-03-05 11:49 /path/dir/dir2


> output.txt結果を別のファイルに保存するには、コマンドの最後に追加します。

答え3

AWKとOperatorが私を助けました。ディレクトリではなくファイルのみが必要なので、ファイルをフィルタリングして「-」で始まる権限列を見つけました。

猫ファイル名| awk '($3 ~ /^-/)'

その後、sedの使用にのみ興味があるので、日付形式を減らして年を示します。

猫ファイル名| awk '($3 ~ /^-/)' sed 's/-[0-9][0-9]//g'

これで awk AND 演算子が 2 つの列を比較し、期待した結果が得られます。

猫ファイル名| awk '($3 ~ /^-/)' | sed 's/-[0-9]//g' | sed 's/-[0-9][0-9 ]//g' | awk ' $8 < 2013 && $10 < 2013 ' > files_older_2012

みんなありがとうございます。ここは私が行った場所の中で最高の場所です。

関連情報