#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