Как добавить множественный поиск в команду AWK

Как добавить множественный поиск в команду AWK

Я пытаюсь найти файлы, созданные в июне, июле и августе. Я использовал этот метод

ls -lrth|awk '/[Jun][Jul][Aug]/ {print}'

но это не работает.

решение1

Вы можете сопоставить несколько шаблонов, например:

awk '/Jun/ || /July/ || /Aug/' <(ls -lrh)

Это возвращает все совпадения для июня, июля или августа. Вам не требуется этот printоператор, так как это awkдействие по умолчанию.

решение2

Как правило, это очень плохая идеяпроанализируйте вывод lsЛучший способ сделать то, что вы хотите, это

stat -c "%n %y" * | grep 2013-0[678]

В качестве альтернативы проверьте только последнее поле, чтобы защититься от маловероятного случая, когда само имя файла является датой:

stat -c "%n %y" *| awk '$NF ~ /2013-0[678]/' 

От man stat:

   -c  --format=FORMAT
          use the specified FORMAT instead of the default; output  a  new‐
          line after each use of FORMAT

   %y     time of last modification, human-readable
   %n     file name

решение3

ls— команда для отображения информации о файлах в удобном для чтения виде.Не используйте его в скриптах..

Команда для поиска файлов в дереве каталогов, соответствующих определенным критериям, выглядит так:find. Если у вас есть GNU find (т. е. невстроенный Linux или Cygwin) или FreeBSD find (т. е. FreeBSD или OSX), вы можете использовать его -newermtдля поиска файлов, которые в последний раз были изменены после определенной даты.

find . -newermt '1 June' ! -newermt '1 September' -print

Добавьте год, если вы хотите сопоставить файлы за определенный год, а не за календарный год, когда запускается скрипт.

Если в вашей реализации find нет -newermt, вам придется обойтись -newer, который сравнивает дату findнайденного файла с фиксированным файлом. Используйте touchдля создания временных файлов с датой, которую вы хотите использовать в качестве границы.

dir=$(mktemp -d)
touch -d 201306010000 "$dir/from"
touch -d 201309010000 "$dir/to"
find . -newer "$dir/from" ! -newer "$dir/to" -print
rm -r "$dir"

Связанный контент