Я пытаюсь отфильтровать строки, содержащие определенное слово. Регулярное выражение — это командная строка ввода для скрипта.
$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