セミコロンで区切られたアドレスを抽出し、各アドレスを1行に印刷します。

セミコロンで区切られたアドレスを抽出し、各アドレスを1行に印刷します。

次の入力を含むファイルがあります。ドットで区切られた数字はアドレスを表します。住所のすべての数字は、以下のように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

しかし、何も印刷されません。

答え1

拡張正規表現-Eまたはegrep)わかりません\d-P@Alexanderが提案したように-Eor[0-9]を使用してください[[:digit:]]

-o完全一致行ではなく一致のみを選択するように追加されました。また、個々の一致を新しい行に分割します。

grep -Eo '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' myfile.txt

または

grep -Eo '[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+' myfile.txt

使用パール正規表現-Pまたはpgrep):

grep -Po '\d+\.\d+\.\d+\.\d+' myfile.txt

+次のように変更しても*機能します。基本正規表現:

grep -o '[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*' myfile.txt

答え2

-E次に置き換えて-P追加してください-o

 grep -P -o '\d+\.\d+\.\d+\.\d+' myfile.txt

答え3

使用awk:

awk 'NF' RS='[][;]' infile

または、tr最初の空行が気に入らない場合は、次のようにします。

tr -s '];[' '\n' <infile

答え4

grep仕事に少し過剰です。tr十分:

$ < input.txt tr -d '[]' | tr ';' '\n' | sort -u

このsort -uセクションでは、重複したアドレスを削除します。

関連情報