Как пропустить запись с помощью awk

У меня есть большое количество файлов в каталоге журналов, чьи имена были помечены временем (в данном случае с date +%b[...]).

Я хочу написать POSIX-совместимую строку, которая будет:

или

  • пропустить строки вывода из ls -ltc которые имеют 2 поля или меньше (как видно из awk) и не содержат константу регулярного выражения /Jul/

или же

  • пропустить вывод первой строки ls -ltc и любая строка не совпадает /Jul/,

Результат для меня такой же, как только первая строка состоит из двух полей (как видно из awk).

Я старался:

> ll -tc | rm $(awk --posix 'NF > 2 && !/Jul/ {print $NF;}')
> ll -tc | rm $(awk --posix 'NF > 2 !/Jul/ {print $NF;}')

Оба имеют плохой синтаксис, потому что условие на NF явно не сосуществует с условием соответствия регулярному выражению ls | awk '/foo/ && /bar/'будет, например.

Может ли sb дать мне подсказки о том, как пропустить произвольную запись и / или применить арифметическое условие к NF и совпадению с регулярным выражением одновременно? Я огляделся, но не смог найти документированный синтаксис, который искал...

2 ответа

Решение

Или

awk 'NF<=2 || /Jul/ {next} {print}'

или же

awk 'NR==1 || /Jul/ {next} {print}'

или, инвертируя логику для сокращения команд, либо

awk 'NF>2 && !/Jul/ {print}'

или же

awk 'NR!=1 && !/Jul/ {print}'
~$ cat input
first line
Gen second third
Feb second third
Mar second third
Apr second third
May second third
Jun second third
Jul second third
Aug second third
Sep second third
Oct second third
Nov second third
Dec second third
~$ awk 'NF<=2 || /Jul/ {next} {print}' input
Gen second third
Feb second third
Mar second third
Apr second third
May second third
Jun second third
Aug second third
Sep second third
Oct second third
Nov second third
Dec second third
~$ awk 'NR==1 || /Jul/ {next} {print}' input
Gen second third
Feb second third
Mar second third
Apr second third
May second third
Jun second third
Aug second third
Sep second third
Oct second third
Nov second third
Dec second third

kos дал абсолютно правильный ответ на ваш вопрос.

Но я думаю, что вы пытаетесь решить проблему, которая не является проблемой. Чтобы удалить файлы, которые соответствуют определенным критериям, вы должны использовать find с параметром -delete,

например:

find . -type f -newermt 2015-07-07  ! -newermt 2015-07-08 -delete
find . -type f -newerat 2015-07-07  ! -newerat 2015-07-08 -delete
Другие вопросы по тегам