Дана наступна команда:
echo "1: " | awk '/1/ -F ":" {print $1}'
чому awk вихід:
1:
Дана наступна команда:
echo "1: " | awk '/1/ -F ":" {print $1}'
чому awk вихід:
1:
Відповіді:
"-F" - це аргумент командного рядка, не синтаксис awk, спробуйте:
echo "1: " | awk -F ":" '/1/ {print $1}'
(pattern){action}
. Якщо pattern
(переважно умовне твердження) вірно , action
виконується. Якщо pattern
немає, true
мається на увазі. Ось те pattern
, про /1/
що йдеться , регулярний1
$0
Якщо ви хочете це робити програмно, ви можете використовувати FS
змінну:
echo "1: " | awk 'BEGIN { FS=":" } /1/ { print $1 }'
Зауважте, що якщо ви зміните його в основному циклі, а не в BEGIN
циклі, це вплине на наступний рядок, прочитаний в, оскільки поточний рядок уже розбитий.
У вас є кілька способів встановити :
роздільник:
awk -F: '{print $1}'
awk -v FS=: '{print $1}'
awk '{print $1}' FS=:
awk 'BEGIN{FS=":"} {print $1}'
Усі вони еквівалентні і для повернення 1
для вибіркового введення "1: 2: 3":
$ awk -F: '{print $1}' <<< "1:2:3"
1
$ awk -v FS=: '{print $1}' <<< "1:2:3"
1
$ awk '{print $1}' FS=: <<< "1:2:3"
1
$ awk 'BEGIN{FS=":"} {print $1}' <<< "1:2:3"
1
BEGIN
твердженням буде найбільш правильним (узгоджується із загальним awk
синтаксисом).
BEGIN
якщо я використовую файл для зберігання всієї речі, хоча -F
це зручно з однокласниками.
awk 'BEGIN{print split("foo:bar",a)}' FS=":" file
іawk 'BEGIN{FS=":"; print split("foo:bar",a)}' file
-F
є аргументом для awk
себе:
$echo "1: " | awk -F":" '/1/ {print $1}'
1
Не потрібно так багато писати. Просто покладіть потрібний роздільник поля з опцією -F в команду awk, а номер стовпця, який ви хочете роздрукувати, відокремлено згідно згаданим роздільником поля.
echo "1: " | awk -F: '{print $1}'
1
echo "1#2" | awk -F# '{print $1}'
1
AWK працює як інтерпретатор тексту, який надходить по рядку для всього документа і виходить по полю для кожного рядка, таким чином, $ 1, $ 2 .. $ n - це посилання на поля кожного рядка ($ 1 - це перше поле, $ 2 - друге поле тощо) ...). Ви можете визначити роздільник поля за допомогою перемикача "-F" під командним рядком або в двох дужках з "FS = ...". Тепер розглянемо відповідь "JUERGEN":
echo "1: " | awk -F ":" '/1/ {print $1}'
Над межами поля встановлено ":", тож у нас є два поля $ 1, що є "1" і $ 2, що є порожнім пробілом. Після цього надходить регулярний вираз "/ 1 /", який доручає фільтру виводити тільки перше поле коли перекладач натрапляє на рядок, що містить такий вираз (я маю на увазі 1); Вихід команди "ехо" - це один рядок, який містить "1", тому фільтр буде працювати ...
Маючи справу з наступним прикладом:
echo "1: " | awk '/1/ -F ":" {print $1}'
Синтаксис безладний, і інтерпретатор вирішив ігнорувати частину F ":" і переходить на роздільник поля за замовчуванням, який є порожнім простором, виводячи "1:" як перше поле, і не буде другого поля!
Відповідь JUERGEN містить хороший синтаксис ...