использование unix -awk на Mac не работает, но онлайн-ресурс работает

#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
      

Проблема:

Вопрос:

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

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

1. wrt the double == should be = НЕТ . == является оператором сравнения, = является оператором присваивания. Если $1=="username" не выдает никаких выходных данных, то это потому, что у вас нет строки ввода, в которой $1 есть значение username . $1="username" выводит каждую строку, потому что вы присваиваете $1 значение be username , а затем проверяет, что результат не равен 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, Не могли бы вы, пожалуйста, сообщить мне, помогло ли вам это решение?