web-dev-qa-db-ja.com

grepを使用して2列目と5列目の文字列を照合するための正規表現

次のような文字列を含むファイル(test.txt)があります。

name1,6.5.8.12,specs1,version1,['66.55.89.12']
name2,19.13.13.159,specs2,version2,['13.13.173.59'; '14.19.232.42']
name3,141.101.196.40,specs3,version3,['11.01.196.0']

1)ドットで区切られた4つの数字としてフォーマットされた、2列目と5列目のすべての文字列をキャプチャしたいのですが、各数字は最大3桁です。

2)2列目に1つの文字列がありますが、5列目には無制限の文字列がありますが、セミコロンで区切られています。

このコマンドを使用して5列目の文字列をすべてキャプチャしようとしましたが(2列目と5列目の両方をキャプチャする方法を見つける必要があります)、このコマンドは最初から機能しませんでした。空のファイルが生成されました:

cat test.txt | cut -d ',' -f5 | grep -P -o '\d{1-3}\.\d{1-3}\.\d{1-3}\.\d{1-3}' > result.txt

grepを使用して2列目と5列目に特別なフォーマット文字列をキャプチャする方法。文字列は、ドットで区切られた4つの数字(1〜3桁)です。 2番目の列には1つの文字列しかありませんが、5番目の列には無制限の文字列がありますが、セミコロンで区切られていますか?

編集:期待される出力:

6.5.8.12
66.55.89.12
19.13.13.159
13.13.173.59
14.19.232.42
141.101.196.40
11.01.196.0

結果を並べ替えて一意にしたいことにも注意してくださいsort -u。この例では文字列を繰り返していませんが、実際のファイルで見つかった場合は繰り返しを避けたいと思います。

1
user9371654

パターンを保持できる他のフィールドはありますか(サンプルには何もありません)?そうでない場合は、試してください

grep -Eo "([0-9]{1,3}\.){3}[0-9]{1,3}" file | sort -u
11.01.196.0
13.13.173.59
141.101.196.40
14.19.232.42
19.13.13.159
6.5.8.12
66.55.89.12

数値で並べ替える場合は、sort-gオプションを使用します。

質問で与えられた独自の解決策については、cutフィールドに-f2,5を試してください。

1
RudiC

awkを回避するには、質問にいくつかの根拠が必要ですが、とにかく、ここに進みます。

$ cut -d, -f2,5 file | egrep -wo '([0-9]{1,3}[.]){3}[0-9]{1,3}'
6.5.8.12
66.55.89.12
19.13.13.159
13.13.173.59
14.19.232.42
141.101.196.40
11.01.196.0

出力をソート+一意にしたい場合は、パイプラインの最後に| sort -uを追加できます;-)

1
mosvy

私の例を修正しましたが、エレガントではありません。

基本的に、awkはフィールドを分離し、sedを使用して不要な文字を取り除き、出力を並べ替えます。申し訳ありませんが、この回答にはgrepはありません。

cat test.txt |awk -F'[,;]' '{print $2"\n" $5}'  | sed 's/\(\[\|\]\)//g' |sed "s/'//g" |sort -r
0
number9

cut+tr+sortを使用したステップバイステップのソリューションは次のとおりです

まず、必須フィールドを取得します

$ cut -d, -f2,5 ip.txt
6.5.8.12,['66.55.89.12']
19.13.13.159,['13.13.173.59'; '14.19.232.42']
141.101.196.40,['11.01.196.0']

次に、不要な文字をすべて削除します

$ cut -d, -f2,5 ip.txt | tr -d "]'[ "
6.5.8.12,66.55.89.12
19.13.13.159,13.13.173.59;14.19.232.42
141.101.196.40,11.01.196.0

次に、,;を改行に変換して、各値が独自の行にあるようにしてから、一意に並べ替えます

$ cut -d, -f2,5 ip.txt | tr -d "]'[ " | tr ',;' '\n' | sort -u
11.01.196.0
13.13.173.59
141.101.196.40
14.19.232.42
19.13.13.159
6.5.8.12
66.55.89.12
0
Sundeep