!X означает "коммуникация административно запрещена", это должно быть задокументировано на страницах руководства (8).
Поскольку Linux использует UDP для маршрутов трассировки, это может происходить из правила --reject-with icmp-host-prohibited
в пункте назначения.
Вы не можете отсортировать все записи только одним проходом.
Чтобы ответить на ваш главный вопрос буквально, чтобы сопоставить поле с переменной, нужно просто сделать match($2,i)
без /.../
(или match($2, i"\"")
для i
, за которым следует "
. Используя обычный синтаксис конкатенации строк).
Даже этот вариант даст правильные результаты для записи, содержащей "4":
awk '{i=4}$0 ~ "\"" i "\""' file1 #(string concatenation yelds to "4")
Но этот вариант, хотя и будет работать без ошибок, не будет автоматически сортировать данные за один проход, как можно было бы ожидать:
awk '{for (i=1;i<8;i++) if ($0 ~ "\"" i "\"") print}' file1
Чтобы отсортировать все записи, нужно сначала загрузить все записи в память, а затем вывести их в порядке сортировки.
Вот другой подход, который работает с вашим образцом файла:
awk -F"[\"]" '{a[$4]?a[$4]=a[$4] ORS $0:a[$4]=$0;last=NR}END{for (i=1;i<=last;i++) if (a[i]) print a[i]}' file1
Использование разделителя "
текст первой строки "fechaName": "1",....
разделится на 4 части и 1
(поле $4) может быть использовано непосредственно как целое число.
Часть a[$4]? a[$4]=a[$4] ORS $0:a[$4]=$0
является просто if-then-else:
если a[$4]
(==> a[1]
для первой строки) уже имеет значение, то добавьте эту строку к предыдущему содержимому a[$4], используя разделитель выходных записей (ORS), который является новой строкой (или может быть простым "\n") - иначе просто примените $0 к a[$4]
Наконец, в конце секции мы просто выводим этот массив a.
Здесь нужно сказать, что sort будет чертовски быстрее awk для этой операции:
LC_ALL=C sort -t"\"" -k3 file1
Кажется, вы хотите напечатать строки, содержащие от 1 до 7. Это будет что-то вроде
awk '/"fechaName": "[1-7]"/ { print }'