Обратное регулярное выражение в AWK?

Обратное регулярное выражение в AWK?

Я пытаюсь отфильтровать строки, содержащие определенное слово. Регулярное выражение — это командная строка ввода для скрипта.

$0 ~ regex {
//Do something.
}

Пример входных данных:

**String** **number**
domain  1
domain  2
bla     3

Таким образом, из приведенных выше входных данных пользователь может сказать: отфильтровать строки, содержащие слово «домен».

Что я пробовал:

regex = "\?\\!domain" 

(отрицательный прогноз).

Но это регулярное выражение отфильтровывает каждую строку. А не только строки со словом «домен».

решение1

Для данного входного файла, inputсодержащего следующее:

domain
demesne

Для фильтрации строк, содержащих domain:

$ awk '/domain/ { print }' input
domain

Фильтровать по строкамнетсодержащий domain:

$ awk '!/domain/ {print }' input
demesne

Для фильтрации на основеполевместо всей строки мы можем попробовать следующее для нового inputфайла:

example www.example.com
exemplar www.example.net

Чтобы отфильтровать строки, где первое полесодержит example:

$ awk '$1 !~ /example/ { print }' input
exemplar www.example.net

В своем вопросе вы указали $0всю строку, а не первое поле.

решение2

Другой более гибкий/мощный способ отфильтровать строки — это {next}:

  • Чтобы напечатать все строки, которыенесопоставьте заданное regex, выполните:
    awk '/regex/ {next} {print}' inputfile
    

С помощью этого метода вы даже можете отфильтровать все строки между двумя определенными строками, как показано ниже:

  • Чтобы напечатать все строки, которыенемежду строкой, совпадающей regex1с первой следующей строкой regex2, совпадающей с первой, выполните:

    awk '/regex1/,/regex2/ {next} {print}' inputfile
    

    что невозможно при данном awk '!/regex/'методе (если я не ошибаюсь).

Например, если inputfileсодержимое вашего файла следующее:

hello, here is my confidential information

SECRET INFO BEGIN
xx
x
xxxxx
xxxx
xxxx
xxxxx
xs
sdf
sdfsdfw
wefwe
SECRET INFO END

This is the end of my message

Затем эта команда awk '/SECRET INFO BEGIN/,/SECRET INFO END/ {next} {print}' inputfileвыведет:

hello, here is my confidential information


This is the end of my message

решение3

echo 'hello, here is my confidential information

SECRET INFO BEGIN
xx
x
xxxxx
xxxx
xxxx
xxxxx
xs
sdf
sdfsdfw
wefwe
SECRET INFO END

This is the end of my message' |  

 mawk 'BEGIN { _^= FS = RS } ! /SECRET INFO/ ? _ : _ * (_=!_)'

 gawk 'BEGIN { _^= FS = "SECRET INFO" } _*(NF <= _^_ || _=!_)'

hello, here is my confidential information


This is the end of my message

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