正規表現をgrepしたいです。私が探しているパターンが連続して何度も表示されることがあります。パターンが複数回表示される場合は、各項目をカンマで区切って印刷したいと思います。競争のみ新しいファイルに完全な行がありません。印刷したい行に表示されない場合私
はい。この正規表現を使用して、[12.123.1.3]パターンの数字を見つけたいと思います。
grep -oh "\[\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\]" 'filename'
入力ファイル(input.txt)
blabla [11.335.2.33] xyuoeretrete [43.22.11.88] jfdfjkfbs [55.66.77.88]
blabla [66.223.44.33]
foo bar
blabla [1.2.33.3] xyuoeretrete [42] bla[1.32.2.4]
新しいファイル(output.csv)の推定結果:
11.335.2.33,43.22.11.88,55.66.77.88
66.223.44.33
n.a.
1.2.33.3,1.32.2.4
注:私はUbuntuを使います。
ベストアンサー1
そしてperl
:
perl -lne '
if (@ips = /\[(\d{1,3}(?:\.\d{1,3}){3})\]/g) {
print join ",", @ips;
} else {
print "n.a.";
}'
Regexp::Common
または、libregexp-common-perl
UbuntuなどのDebianベースのシステムのパッケージ内のドットで区切られたクワッドIPv4アドレスの正規表現を使用します。
perl -MRegexp::Common=net -lne '
if (@ips = /\[($RE{net}{IPv4})\]/g)
print join ",", @ips;
} else {
print "n.a.";
}'
を使用すると、-n
stdinが入力を提供し、パスが追加の引数として提供されているファイルから読み取られたり、などの引数が渡された場合は、いくつかのコマンドの出力から読み取ることができますsome commands|
。デフォルトではstdoutとして印刷perl
し、(追加)または(ファイルが最初に切り取られずに読み書きモードで開かれることを除いて)print
などのリダイレクト演算子を使用してシェルからファイルにリダイレクトできます。そして、おそらくシェルによってはより多くのものがあります。 。>
>>
1<>
>
入力ファイルの内容を最終的に置き換える出力オプションを追加することもできます-i
(そのパスは引数として指定する必要があります)。
ここで、入力は名前付きファイルから取得され、出力input.txt
でファイルを上書きまたは生成します。output.csv
< input.txt perl... > output.csv