Awk, не представляющий любой результат

Используя grep только, Вы могли создать следующий канал:

grep -A1 'Foo' input_file | grep -B1 'Bar' | grep 'Foo'

Первое grep получит все строки, которые содержат Foo а также строка после соответствия. Затем мы получаем строки, которые содержат Bar а также строка перед соответствием, и наконец извлекает строки из этого вывода, которые содержат Foo.

Править: Как manatwork указанный, существуют некоторые проблематичные случаи, чтобы быть соблюдающими. Хотя интересная задача, из-за grepстрока ориентировала функциональность, любым решением с нею, вероятно, будет 'взлом', и Вы - вероятно, более обеспеченное использование чего-то как pcregrep который больше подходит для задачи под рукой.

2
15.10.2013, 22:25
2 ответа

Проблема здесь - это awk не имеет никакого способа сказать что d в шаблоне предназначен для представления переменной того имени: awk попытка состоит в том, чтобы соответствовать литералу d. Можно использовать расширение параметра вместо этого:

ls -l | awk "/$Date/ {print \$NF}"

Тем не менее две вещи отметить:

2
27.01.2020, 21:50
  • 1
    -v говорит awk использовать переменную окружения –  dchirikov 15.10.2013, 15:24
  • 2
    @dchirikov Насколько я знаю, -v используется для присвоения переменных, локализованных awk не получают переменные из Вашей текущей среды. –  Joseph R. 15.10.2013, 15:42
  • 3
    Право. К переменным среды можно получить доступ через ENVIRON массив. Таким образом, если Вы ранее export Date, затем ls -l | awk '$0 ~ ENVIRON["Date"] {print $NF}' будет также работать. –  manatwork 15.10.2013, 15:48
  • 4
    да! ENVIRON конечно. И -v для переменных оболочки. –  dchirikov 15.10.2013, 15:57
  • 5
    @Ram, Довольного, что я помог. Я полагаю, что ответ dchirikov был лучше все же. Держитесь подальше от вывода ls если Вы не анализируете его глазами. –  Joseph R. 15.10.2013, 17:48

Необходимо использовать его этот путь:

ls -l | awk -v d="$Date" '$0 ~ d {print $NF}'

Объяснение здесь

Но может быть, лучше использовать find в Вашем сценарии.

find . -maxdepth 1 -type f -daystart -ctime -`date "+%d"`

Если у Вас есть классик awk вместо gawk:

find * -prune -type f -cmin -`date '+%d %H %M' | awk '{print ($1*24+$2)*60+$3}'`
7
27.01.2020, 21:50
  • 1
    +1 я надеюсь, что Вы не возражаете, я отредактировал Вашу ссылку так, чтобы это указало непосредственно на соответствующий раздел вместо TOC. –  Joseph R. 15.10.2013, 16:00
  • 2
    Так как я использую машину AIX 6.1, флаги, такие как-maxdepth и-daystart не доступны. –  Ram 15.10.2013, 16:34
  • 3
    Хорошо. Я добавил обновление. Надежда это помогает. –  dchirikov 15.10.2013, 16:52

Теги

Похожие вопросы