И операция по 2 столбцам (даты доступа и mofidy) в файле в linux

У меня есть большой миллионный файл записей, который состоит из «каталогов, имен файлов, разрешений, группы и владельца, размера, последней доступной даты, последней измененной даты, последней измененной даты». Мне нужно получить строки (файлы), которые имеют последний доступная дата И последняя измененная дата меньше или равна 2012 году. Можете ли вы помочь в предоставлении awk, sed или любых методов.

Пример:

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 

Самый короткий код awk:

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

Это использует действие по умолчанию (печать) для записей, которые проходят тест.
Он также использует лексическую сортировку, где:

  • "2012-12-31" < "2013" – это правда и
  • "2013-01-01" < "2013" неверно

Пример ввода изменен, чтобы получить одну соответствующую строку на выходе

 $ 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 или предшествующий (при условии, что первые две цифры в году не превышают 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 в конец команды, чтобы сохранить результаты в другом файле

AWK и Operator помогли мне здесь. Поскольку мне нужны были только файлы, а не каталоги, я отфильтровал файл для столбца разрешений, начиная с «-».

cat filename | awk '($ 3 ~ / ^ – /)'

Затем сократите формат даты, чтобы представить год, поскольку меня беспокоит только использование sed.

cat filename | awk '($ 3 ~ / ^ – /)' | sed 's / – [0-9] [0-9] // g'

Теперь оператор awk AND сравнивает два столбца, и я получил результат, которого я ожидаю.

cat filename | awk '($ 3 ~ / ^ – /)' | sed 's / – [0-9] [0-9] // g' | awk '$ 8 <2013 && $ 10 <2013'> files_older_2012

Спасибо всем. Это лучшее место, которое я когда-либо посещал.