Как добавить несколько поисков в команде AWK

10

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

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

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

OmiPenguin
источник
1
Для записи, [...]конструкция соответствует одному символу, который может быть любым из символов в скобках. Таким образом, ваше выражение соответствует JJA или Jug( Jот [Jun], uот [Jul]и gот [Aug]), но не к аббревиатурам месяца, которые вы надеялись найти.
tripleee

Ответы:

12

Вы можете сопоставить несколько шаблонов следующим образом:

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

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

jasonwryan
источник
1
awk понимает расширенные регулярные выражения, поэтому для такого простого шаблона вы могли бы написать его как awk '/Jun|Jul|Aug/'илиawk '/Ju[nl]|Aug/'
cas
5

Как правило, разбирать вывод команды 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
Тердон
источник
Это также хороший пример. Я никогда не проверял STAT раньше. спасибо за отличную информацию
OmiPenguin
Возможно, измените на ..., | awk '$NF ~ /2013-0[678]/'чтобы проверить только последнее поле вывода, в (маловероятном?), Даже если имя файла соответствует регулярному выражению, даже если дата не совпадает.
tripleee
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"
Жиль "ТАК - перестань быть злым"
источник