grepを使用して2番目と5番目の列の文字列を一致させる正規表現

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)2番目と5番目の列のすべての文字列を、ドットで区切られた4つの数値形式でキャプチャしたいと思います。各数字は最大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

ngを使用して2番目と5番目の列の特殊な形式の文字列をキャプチャする方法grep。ここで、文字列は点で区切られた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

スキーマを保持できる他のフィールドがあります(例では見つかりません)。そうでない場合は、お試しください。

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オプションを使用してください。

質問に記載されている独自のソリューションを表示するには、-f2,5入力cutフィールドを試してください。

答え2

あなたの回避に対する正当性は質問に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パイプの端に自分自身を追加できます;-)

答え3

以下は、以下を使用する段階的なソリューションです。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

答え4

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

デフォルトでは、awkはフィールドを切り離し、sedを使用して不要な文字を削除し、出力をソートします。申し訳ありません。この答えにはgrepはありません。

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

関連情報