特定の単語を含む行をフィルタリングしようとしています。正規表現はスクリプトへのコマンドライン入力です。
$0 ~ regex {
//Do something.
}
入力例は次のとおりです。
**String** **number**
domain 1
domain 2
bla 3
したがって、上記の入力では、ユーザーは「domain」という単語を含む行をフィルタリングすると言うことができます。
私が試したこと:
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
この方法を使用して、次のように特定の2行間のすべての行をフィルタリングすることもできます。
すべての行を印刷いいえ行の一致
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