Дана следующая команда:
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
(в основном условный оператор) имеет значение true , 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); Вывод команды "echo" - это одна строка, содержащая "1", поэтому фильтр будет работать ...
При работе со следующим примером:
echo "1: " | awk '/1/ -F ":" {print $1}'
Синтаксис грязный, и интерпретатор решил игнорировать часть F ":" и переключается на разделитель полей по умолчанию, который является пустым пространством, таким образом, выводя "1:" в качестве первого поля, и второго поля не будет!
Ответ JUERGEN содержит хороший синтаксис ...