次の文字列を含むファイル(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