#unix #awk
#unix #awk
Вопрос:
Обзор:
- работает под управлением macOS Mojave 10.14.3 и RHEL 7.6
- awk версии 20070501 на macOS и GNU Awk 4.0.2 на RHEL 7.6
-
есть файл со следующими двумя строками
username=jsmith api=2343234sdfkljasf
-
пытаюсь выполнить следующую команду AWK
awk -F= '$1=="username"||$1=="api"{print$2}' file.txt
-
попытка извлечь
jsmith 2343234sdfkljasf
Проблема:
- попытка запустить его на macOS или RHEL 7.6 ничего не возвращает.
- немного поисковых решений, и я обнаружил, что double == должно быть = но везде, где я видел awk, они используют
==
в своем примере.awk -F= '$1="username"||$1="api"{print$2}' file.txt
- использование онлайн-инструмента, с которым он работает
==
https://tio.run/##Nck5CoAwEEDR3mMEWwudaaf1HikCZrKSRCzUqzsuYPPh8/TmRPqRSK3VlKiDUcfxvc5W7bnY2PrpFPmZuAbblu5hAgR07DxPwOjBvUEGj3yl3GyKVYaZbg
Вопрос:
- Какой синтаксис правильный, поскольку везде используется синтаксис
==
? - Как вы получаете только
jsmith
или2343234sdfkljasf
?
Комментарии:
1. wrt
the double == should be =
— НЕТ .==
является оператором сравнения,=
является оператором присваивания. Если$1=="username"
не выдает никаких выходных данных, то это потому, что у вас нет строки ввода, в которой$1
есть значениеusername
.$1="username"
выводит каждую строку, потому что вы присваиваете$1
значение beusername
, а затем проверяет, что результат не равен null, чего на самом деле нет, и затем печатает из-за этого. Ваш входной файл должен содержать начальные пробелы, управляющие символы или что-то еще,
Ответ №1:
Немного отредактировал file
, чтобы быть более наглядным:
$ cat file
username=user1
api=pass1
username=user2
api =pass2
Обратите внимание на 2 пробела, добавленных к записям 3 и 4. Сначала с помощью ==
:
$ awk -F= '$1=="username"||$1=="api"{print$2}' file
user1
pass1
Были сопоставлены только записи 1 и 2. Теперь, если вы используете =
, вы ничего не сопоставляете, вместо этого вы устанавливаете $1
:
$ awk -F= '$1="username"||$1=="api"{print$2}' file
user1
pass1
user2
pass2
То, что вы задаете, это:
$ awk -F= '$1="username"||$1=="api"{print $1,$2}' file
1 user1
1 pass1
1 user2
1 pass2
Tl; dr: ==
правильно.
Ответ №2:
Попробуй это:
awk -F'=' '{gsub(/[[:space:]]/,"")} $1 == "username" || $1 == "api" { print $2; } ' file.txt
Правильный способ сравнения — это ==
или ~
использовать совпадение регулярных выражений.
=
является assign, который всегда будет оставлять условие с True
, так что это будет print
независимо ни от чего.
У вас могут быть пробелы в строке, поэтому ==
проверка false, сначала удалите эти пробелы с помощью gsub
.
Также лучше добавить пробел между элементами в коде.
Ответ №3:
Не могли бы вы, пожалуйста, попробовать следующее. Я удаляю начальный и конечный пробелы в строке, учитывая, что вам это может не понадобиться. Затем проверьте, является ли первое поле либо username
, либо api
затем выведите последнее поле этой строки.
awk -F'=' '{gsub(/^[[:space:]] |[[:space:]] $/,"")} $1~/^username$|^api$/{print $NF}' Input_file
Или предполагается, что ваш Input_file содержит символы Control-M?(поскольку ваша попытка работает нормально для меня и при условии, что ваш Input_file совпадает с показанными примерами). Проверьте один раз, есть ли у вас элементы управления M (s) или нет, выполнив cat -v Input_file
в случае, если они у вас есть, вы можете попробовать следующую команду.
awk -F'=' '{gsub(/^[[:space:]] |[[:space:]] $|r/,"")} $1~/^username$|^api$/{print $NF}' Input_file
Комментарии:
1. @Lacer, Не могли бы вы, пожалуйста, сообщить мне, помогло ли вам это решение?