![Как добавить множественный поиск в команду AWK](https://rvso.com/image/50595/%D0%9A%D0%B0%D0%BA%20%D0%B4%D0%BE%D0%B1%D0%B0%D0%B2%D0%B8%D1%82%D1%8C%20%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9%20%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%20%D0%B2%20%D0%BA%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4%D1%83%20AWK.png)
Я пытаюсь найти файлы, созданные в июне, июле и августе. Я использовал этот метод
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"