awk + print line только если первое поле начинается со строки как Linux1

15

как напечатать строку, если первое поле начинается с Linux1

например:

  echo Linux1_ver2  12542 kernel-update  |   awk '{if ($1 ~ Linux1 ) print $0;}'

цель состоит в том, чтобы напечатать строку, в то время как первое поле начинается с Linux1

пример строк:

Linux1-new  36352 Version:true
Linux1-1625543  9847
Linux1:16254 8467563 

примечание - пробел или табуляция могут быть до первой подачи

Яэль
источник

Ответы:

15

В одну сторону:

echo "Linux1_ver2  12542 kernel-update"  |  awk '$1 ~ /^ *Linux1/'
Гуру
источник
$ 1 и ^ избыточны. Ваше предложение не распространяется на вкладки.
Хауке Лагинг
@HuakeLaging Почему вы думаете, что $ 1 и ^ избыточны? Я вполне уверен, что оба требуются, чтобы первое слово сопоставлялось только с тем, чтобы совпадение было привязано в начале (например, «mLinux» мог быть сопоставлен с / Linux1 /, но не с / ^ Linux /).
Ник Булл,
19

awk игнорирует начальные пробелы при назначении полей. Команда по умолчанию - печать.

awk '$1 ~ /^Linux1/'

Это то, что вы хотите.

Детальное объяснение:

  • $ 1 говорит awk посмотреть на первый «столбец».
  • ~ сообщает awk о соответствии регулярного выражения /..../ является регулярным выражением.
  • Внутри RE находится строка Linux и специальный символ ^.
  • ^ заставляет RE совпадать с самого начала (в отличие от совпадения в любом месте строки).

Если смотреть вместе: Awk будет сопоставлять регулярное выражение с «Linux» в начале первого столбца.

Johan
источник
2

Это должно работать для этого конкретного случая.

awk '/^[[:blank:]]*Linux1/ {print}'
Бернхард
источник
но если пространство до Linux1, то оно не будет совпадать
yael
@yael Я сделал правку, чтобы исправить это.
Хауке Лагинг
+1 Любому, кто интересуется, что делает этот синтаксис: он говорит: «делайте вещи внутри фигурных скобок, только если регулярное выражение соответствует этой строке».
Мердад