AWK соответствует точной строке внутри квадратных скобок

#shell #awk

#оболочка #awk

Вопрос:

У меня есть файл, похожий на приведенные ниже данные.

 https://www.test.example.com [503]
https://www.tst.example.com [403]
https://www.tt.example.com [302]
 

Я хочу получить строки, которые соответствуют второму столбцу. Например, должны печататься только строки, соответствующие [403] https://www.tst.example.com .

Я попытался избежать квадратных скобок с помощью приведенной ниже команды, которая выдала мне предупреждение.

 $ awk -F "$2 == '[403]'" file.txt
awk: warning: escape sequence `[' treated as plain `['
awk: warning: escape sequence `'' treated as plain `''
 

Комментарии:

1. Я откатил ваше последнее редактирование. Фундаментальное изменение вопроса после того, как вы получили несколько ответов, неприемлемо; это делает недействительными эти ответы и сбивает с толку новых посетителей, помимо несправедливого перехода к воротам. Вместо этого (примите один из приведенных здесь ответов или отправьте один из своих и примите его, если хотите, и) задайте новый вопрос с четко изложенными требованиями. (Вероятно, позаботьтесь о том, чтобы объяснить, как вы представляете любые управляющие символы, например, буквенный escape-символ.)

Ответ №1:

Вы смешиваете регулярные выражения и простые строки. [ это специальный символ регулярного выражения, но здесь вы используете не регулярное выражение, а просто сравнение буквальных строк. Вам вообще не нужно никакого экранирования (хотя вы можете для простоты отменить использование одинарных и двойных кавычек, если вы на самом деле не используете Windows).

 awk '$2 == "[403]"' file.txt
 

В основном во всех оболочках Unix двойные кавычки, которые вы использовали, не защищают знаки доллара, поэтому $2 они будут заменены оболочкой, возможно, ничем, или какой-либо несвязанной строкой (независимо от того, что было передано в качестве второго аргумента командной строки оболочке). Аргумент командной строки).

-F Опция, если она присутствует, требует аргумента; но, основываясь на данных вашего примера, разделитель полей по умолчанию — любая последовательность пробелов — должен работать нормально. Если вы хотите принудительно использовать, например, один пробел, попробуйте -F ' ' .

Ответ №2:

Не могли бы вы, пожалуйста, попробовать следующее, написанное и протестированное с показанными примерами в GNU awk .

 awk -F'([[:space:]]*)?\[|\]([[:space:]]*)?' '$2=="403"{print $1}' Input_file
 

Объяснение: Установка разделителя полей в виде пробелов (необязательно)[ ИЛИ [пробелов (необязательно) для всех строк. Затем, проверяя, является ли 2-е поле 403 , затем распечатайте первое поле в соответствии с запросом OP.

Комментарии:

1. ITYM -F'([[:space:]]*\[)|(][[:space:]]*)'

2. @EdMorton, веселого рождества, сэр, спасибо вам за то, что всегда направляли, да благословит вас БОГ, приветствую 🙂

3. Счастливого Рождества и вам, и счастливого Нового года (или Guid Hogmanay, как мы, шотландцы, говорим), когда он наступит!

Ответ №3:

Будет делать то, что вы хотите, с тем преимуществом, что вы можете передавать нужный код в качестве аргумента, а не жестко закодировать его в awk-скрипт.

 awk -v http_code=403 '$2 == "["http_code"]"' file.txt