У меня есть файл, аналогичный приведенным ниже данным.
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 `''
Вы смешиваете регулярные выражения и простые строки. [
— это специальный символ регулярного выражения, но здесь вы не используете регулярное выражение, а просто буквальное сравнение строк. Вам вообще не нужно никакого экранирования (хотя для простоты вы можете изменить использование одинарных и двойных кавычек, если только вы на самом деле не используете Windows).
awk '$2 == "[403]"' file.txt
В основном во всех оболочках Unix двойные кавычки, которые вы использовали, не защищают знаки доллара, поэтому $2
будет заменена оболочкой, возможно, ничем, или же какой-то несвязанной строкой (независимо от того, что было передано в качестве второго аргумента командной строки к оболочке).
Опция -F
, если она присутствует, требует аргумента; но на основе данных вашего примера разделитель полей по умолчанию - любая последовательность пробелов - должен работать нормально. Если вы хотите заставить его, например. один пробел, попробуйте -F ' '
.
Не могли бы вы попробовать выполнить, написать и протестировать показанные образцы в GNU awk
.
awk -F'([[:space:]]*)?\\[|\\]([[:space:]]*)?' '$2= = "403"{print $1}' Input_file
Объяснение: установка разделителя полей в виде пробелов (необязательно)[ ИЛИ [пробелов (необязательно) для всех строк. Затем проверьте, является ли второе поле 403
, затем напечатайте первое поле в соответствии с запросом OP.
ИТИМ -F'([[:space:]]*\\[)|(][[:space:]]*)'
@EdMorton, счастливого Рождества, сэр, спасибо, что всегда направляете, да благословит вас БОГ :)
Вас тоже с Рождеством и с Новым годом (или, как говорят шотландцы, Гвид Хогманай), когда он наступит!
Будет делать то, что вы хотите, с тем преимуществом, что вы можете передать желаемый код в качестве аргумента, а не жестко запрограммировать его в сценарии awk.
awk -v http_code=403 '$2 == "["http_code"]"' file.txt
Я откатил ваше последнее редактирование. Принципиально менять вопрос после того, как вы получили несколько ответов, недопустимо; это делает эти ответы недействительными и сбивает с толку новых посетителей, помимо несправедливого перемещения к стойкам ворот. Вместо этого (примите один из ответов здесь или отправьте свой собственный и примите его, если хотите, и) задайте новый вопрос с четко изложенными требованиями. (Возможно, постарайтесь объяснить, как вы представляете любые управляющие символы, например, буквальный escape-символ.)