Linux awk команда для получения первой и последней строки - PullRequest
0 голосов
/ 21 июня 2019

Я пытаюсь получить первый и последний ряд команды awk , но не могу. Где я делаю ошибки.

egrep 'updateAll|update-mgr|Startup REX|configd.*UnitProperty updated' $LOG | \
  awk 'NR == 1{print $1" "$2" "$3} NR == $#{print $1" "$2" "$3}'

awk: cmd. line:2: NR == 1{print $1" "$2" "$3} NR == $#{print $1" "$2" "$3}
awk: cmd. line:2:                                    ^ syntax error

Я ожидаю, что первая строка и последняя строка формируют вывод команды grep.

Ответы [ 3 ]

1 голос
/ 21 июня 2019

Кстати - большую часть времени, когда вы используете grep & awk в одной команде, вы делаете это неправильно;)

awk '
{  
    if ($0~/updateAll|update-mgr|Startup REX|configd.*UnitProperty updated/) {
       c++
       l=$0
       if(c==1){print}       
    }
}
END{print l}
'  $LOG
0 голосов
/ 22 июня 2019

@ Тинк раствор правильный. Я просто хочу добавить это:.

Использование переменной l является плохой практикой, поскольку ее можно принять за 1 или I в зависимости от текущего шрифта.

Шаблон соответствия по умолчанию может быть извлечен как шаблон фильтра для обработки записи.

Таким образом, решение @tink становится:

awk '
/updateAll|update-mgr|Startup REX|configd.*UnitProperty updated/ {  
    c++;
    lastLine = $0;
    if(c == 1){print}       
}
END{print lastLine}
'  $LOG
0 голосов
/ 21 июня 2019

Используйте NR == 1, чтобы получить первую строку, и END, чтобы получить последнюю строку.

Имея этот ввод:

$ echo -e '1 a v\n2 b w\n3 c x\n4 d y\n5 e z'
1 a v
2 b w
3 c x
4 d y
5 e z

мы можем разобрать его с помощью этой команды awk:

$ echo -e '1 a v\n2 b w\n3 c x\n4 d y\n5 e z' | awk 'NR == 1 { print $2; } END { print $2; }'
a
e
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...