Як додати кілька пошукових запитів у команді AWK


10

Я намагаюся шукати файли, створені у червні, липні та серпні місяців. Я використовував цей метод

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

але це не працює.


1
Для запису [...]конструкція відповідає одному символу, який може бути будь-яким із символів між дужками. Отже, ваше вираження відповідає JJA або Jug( Jвід [Jun], uвід [Jul]і gвід [Aug]), але не абревіатури місяця, на які ви сподівалися відповідати.
трійка

Відповіді:


12

Ви можете зіставити декілька моделей, таких як:

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

Це повертає всі збіги для червня, липня або серпня. printВиписка не потрібна, як це awkдію за замовчуванням.


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]/'щоб перевірити лише останнє поле виводу в (мабуть?) Навіть те, що ім'я файлу відповідає регексу навіть тоді, коли дата не відповідає.
трійка

3

lsце команда для відображення інформації про файли, доступні для читання людиною. Не використовуйте це в сценаріях .

Команда на пошук файлів у дереві каталогів відповідає певним критеріям find. Якщо у вас є GNU find (тобто невбудований Linux або Cygwin) або FreeBSD find (тобто FreeBSD або OSX), ви можете використовувати -newermtдля зіставлення файлів, востаннє змінених після певної дати.

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

Додайте рік, якщо ви хочете відповідати файлам у конкретному році, а не календарному році, коли сценарій працює.

Якщо у вашій реалізації не знайдеться -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"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.