рядок друку awk +, лише якщо перше поле починається з рядка як Linux1


16

як надрукувати рядок у випадку, якщо перше поле розпочнеться з 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 

зауваження - пробіл або TAB може бути до першого подання

Відповіді:


15

Односторонній:

echo "Linux1_ver2  12542 kernel-update"  |  awk '$1 ~ /^ *Linux1/'

$ 1 і ^ є зайвими. Ваша пропозиція не містить вкладок.
Hauke ​​Laging

@HuakeLaging Чому ви вважаєте, що $ 1 і ^ є зайвими? Я впевнений, що обидва потрібні, щоб перше слово було узгоджене лише проти, і щоб відповідність була закріплена на початку (наприклад, "mLinux" міг би відповідати / Linux1 /, але не / / Linux /).
Нік Булл

19

awk ігнорує провідні пробіли при призначенні полів. Команда за замовчуванням - print.

awk '$1 ~ /^Linux1/'

Це те, що ти хочеш.

Детальне пояснення:

  • $ 1 повідомляє awk подивитися на першу "колонку".
  • ~ каже awk, щоб відповідати RegularExpression /..../ - це регулярний вираз.
  • У межах RE - рядок Linux та спеціальний символ ^.
  • ^ викликає збіг RE з самого початку (на відміну від відповідності в будь-якій точці рядка).

Побачене разом: Awk співставить звичайний вираз із "Linux" на початку першого стовпця.


2

Це повинно працювати в цьому конкретному випадку.

awk '/^[[:blank:]]*Linux1/ {print}'

але якщо простір перед Linux1, воно не збігатиметься
1313

@yael Я змінив це, щоб виправити це.
Hauke ​​Laging

+1 Для всіх, хто цікавиться, що робить цей синтаксис: він говорить "робити все, що знаходиться в дужках, лише якщо регулярний вираз відповідає цьому рядку".
користувач541686
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.