Awk несколько поисковых терминов с переменной и отрицанием

У меня есть небольшой тестовый файл, содержащий:

awk this   
and not awk this  
but awk this  
so do awk this  

И я пробовал следующие команды awk, в bash, но каждая не выводит:

f=awk; awk '/$f/ && !/not/' test.txt
f=awk; awk '/\$f/ && !/not/' test.txt
f=awk; awk '/"$f"/ && !/not/' test.txt
f=awk; awk -v f="$f" '/f/ && !/not/' gtest.txt

Использование двойных кавычек " выдает ошибку "событие не найдено" в оболочке из-за !,

Как я могу искать переменную и отменять другую строку в той же команде?

2 ответа

Решение

Использование awk как это:

f='awk'

awk -v f="$f" -v n='not' '$0 ~ f && $0 !~ n' file
awk this
but awk this
so do awk this

Или если вы не хотите проходить n='not' в awk:

awk -v f="$f" '$0 ~ f && $0 !~ /not/' file

awk this
but awk this
so do awk this

awk указывает на gawk для меня, и следующее работает просто отлично:

awk -vf=awk '$0 ~ f && !/not/' file
Другие вопросы по тегам