awk цитирование текста программы

awk цитирование текста программы

Я только что наткнулся на одну ошибку в awk и хотел бы узнать, может ли кто-нибудь объяснить мне, почему это происходит.

Следующие 2 строки ведут себя по-разному, если я запускаю:

# grep -Rl BASE_DIR --exclude-dir=.svn * | awk -F "/" '{print $1}'

Я получаю (как и ожидалось) только первый каталог пути к файлам, содержащим BASE_DIR.

Однако, если я запущу его следующим образом:

# grep -Rl BASE_DIR --exclude-dir=.svn * | awk -F="/" "{print $1}"

РЕДАКТИРОВАТЬ:

-F="/"и -F "/"не оказывают никакого влияния на мои тесты. Вторая команда была обновлена, чтобы показать это

как предложил Гленн Джекман в ответе, я изменил команду на:

# grep -Rl BASE_DIR --exclude-dir=.svn * | awk -F "/" "{print $1}"

и получил точно такой же некорректный результат

Конец РЕДАКТИРОВАНИЯ

Я получаю полный путь к файлам, содержащим BASE_DIR, я пробовал экранировать текст программы на случай, если "{print \$1}"проблема в этом, но я получил тот же результат.

Может ли кто-нибудь объяснить мне, в чем здесь проблема?

решение1

В первом примере вы делаете: awk -F "/"
В следующем примере вы делаете:awk -F="/"

Итак, разделитель полей другой: вы используете двухсимвольную строку =/в качестве разделителя полей.


Ах, не знаю, почему я не видел этого раньше: вы используете неправильные цитаты:

# grep -Rl BASE_DIR --exclude-dir=.svn * | awk -F "/" "{print $1}"
------------------------------------------------------^

Двойные кавычки вокруг программы awk означают, что оболочка заменит переменную$1 допередача программы в awk. Скорее всего, в оболочке $1пусто, поэтому awk видит это:{print }

Вместо этого используйте одинарные кавычки.

Связанный контент