Я только что наткнулся на одну ошибку в 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 }
Вместо этого используйте одинарные кавычки.