「ディレクトリ、ファイル名、権限、グループおよび所有者、サイズ、最後のアクセス日、最後の変更日、最後の変更日」を含む数百万のレコードファイルがあります。最後の行(ファイル)アクセス日と最後の変更日を取得する必要があります。 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
みんなありがとうございます。ここは私が行った場所の中で最高の場所です。