次の入力のファイルがあります。ドットで区切られた数字はアドレスを表します。アドレス内の任意の数字は、次のように1桁以上にすることができます。
[112.112.112.112;3.3.3.3;44.44.44.44]
[6.6.6.6;17.17.17.17;88.88.88.88]
セミコロンと括弧なしで各アドレスを抽出したい(アドレスはセミコロンで区切られている;
)、新しいファイルの1行に各アドレスを挿入して、次の出力を生成します。
112.112.112.112
3.3.3.3
44.44.44.44
6.6.6.6
17.17.17.17
88.88.88.88
最初のステップとして、次のようにgrepでアドレスを抽出しようとしました。
grep -E '\d+\.\d+\.\d+\.\d+' myfile.txt > newfile.txt
しかし、それは何も印刷しません。
拡張正規表現(-E
またはegrep
)は\d
について知りません。 @Alexanderの提案に従って-P
を使用するか、代わりに-E
または[0-9]
とともに[[:digit:]]
を使用してください。
-o
を追加して、一致する行全体ではなく、一致するもののみを選択します。これにより、単一の一致が新しい行に分割されます。
grep -Eo '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' myfile.txt
または
grep -Eo '[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+' myfile.txt
Perl Regex(-P
またはpgrep
)を使用:
grep -Po '\d+\.\d+\.\d+\.\d+' myfile.txt
+
を*
に変更すると、基本正規表現を使用することもできます。
grep -o '[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*' myfile.txt
-E
を-P
に置き換え、-o
を追加します。
grep -P -o '\d+\.\d+\.\d+\.\d+' myfile.txt
awk
の使用:
awk 'NF' RS='[][;]' infile
または、最初の空の行を気にしない場合はtr
を使用します。
tr -s '];[' '\n' <infile
grep
は、このタスクにとってはやり過ぎです。 tr
で十分です:
$ < input.txt tr -d '[]' | tr ';' '\n' | sort -u
sort -u
partは、重複するアドレスを削除します。