unix - использование awk на mac не работает, но онлайн-ресурс работает - PullRequest
0 голосов
/ 14 марта 2019

Обзор:

  • под управлением MacOS Mojave 10.14.3 и RHEL 7.6
  • awk версия 20070501 на macOS и GNU Awk 4.0.2 на RHEL 7.6
  • *У 1008 * есть файл со следующими двумя строками
    username=jsmith
    api=2343234sdfkljasf
    
  • , пытающийся выполнить следующую команду AWK

    • awk -F= '$1=="username"||$1=="api"{print$2}' file.txt
  • пытается извлечь

    jsmith
    2343234sdfkljasf
    

Проблема:

Вопрос:

  • Какой синтаксис правильный, так как везде синтаксис ==?
  • Как получить только jsmith или 2343234sdfkljasf?

Ответы [ 3 ]

2 голосов
/ 14 марта 2019

Редактирование бита 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: == правильно.

1 голос
/ 14 марта 2019

Попробуйте это:

awk -F'=' '{gsub(/[[:space:]]/,"")} $1 == "username" || $1 == "api" { print $2; } ' file.txt

Правильный способ сравнения IS == или ~ для использования соответствия регулярному выражению.
= - это присвоение, которое всегда будет выходить из условия с True, поэтому оно будет print независимо от того, что.
У вас могут быть пробелы в строке, поэтому ==, проверяющий ложь, сначала удалите эти пробелы с помощью gsub.
Также лучше добавить пробел между элементами в коде.

0 голосов
/ 14 марта 2019

Не могли бы вы попробовать тоже. Я удаляю начальный и конечный пробелы в строке, учитывая, что вам это может не понадобиться. Затем проверьте, является ли первое поле username или api, затем выведите последнее поле этой строки.

awk -F'=' '{gsub(/^[[:space:]]+|[[:space:]]+$/,"")} $1~/^username$|^api$/{print $NF}' Input_file


ИЛИ при условии, что ваш Input_file содержит символы Control-M? Проверьте один раз, если у вас есть контроль M (s) или нет, выполнив cat -v Input_file, если у вас есть, то вы можете попробовать следующую команду.

awk -F'=' '{gsub(/^[[:space:]]+|[[:space:]]+$|\r/,"")} $1~/^username$|^api$/{print $NF}' Input_file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...