出力を生成するスクリプトがあります。次のようなIPアドレスの出力を確認したい
159.143.23.12
134.12.178.131
124.143.12.132
if (IPs are found in <file>)
then // bunch of actions //
else // bunch of actions //
fgrep
は良い考えですか?
利用可能なbashがあります。
はい、使用できるオプションやツールはたくさんあります。私はこれを試したところ、うまくいきました:
ifconfig | grep -oE "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b"
grep -oE "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b"
を使用して、出力からIPアドレスをgrepできます。
ファイルの名前がips
の場合は、次のように記述できます。
while read -r ip
do
if [[ $ip == "$1" ]]; then
shift
printf '%s\n' 'action to take if match found'
else
printf '%s\n' 'action to take if match not found'
fi
done < ips
次に、スクリプトに従ってパラメータを渡すことができます
./myscript 159.143.23.12 134.12.178.131 124.143.12.132 124.143.12.132
SmartOS (Solarisのバリアント)でテストされています。他の* nix環境でも動作するはずです。
_egrep '(([0-9]|[0-9]{2}|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[0-9]{2}|1[0-9]{2}|2[0-4][0-9]|25[0-5])'
_
例:
_$ cat >file.txt
IP1: 192.168.1.1
IP2: 261.480.201.311
IP3: 1012.680.921.3411
$ egrep '(([0-9]|[0-9]{2}|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[0-9]{2}|1[0-9]{2}|2[0-4][0-9]|25[0-5])' file.txt
IP1: 192.168.1.1
_
このパターンはvalidIPv4にのみ一致します。つまり、_x.x.x.x
_で、x
の範囲は0〜255です。一致したIPのみを抽出する必要がある場合は、上記のコマンドに_-o
_オプションを追加します。このコマンドをbashスクリプトに埋め込むことができ、おそらく他のシェルスクリプトにも埋め込むことができます。そして、egrep
が失敗した場合、_try grep -E ...
_
(bash)シェルスクリプトで使用する:
ip=$(egrep -o '(([0-9]|[0-9]{2}|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[0-9]{2}|1[0-9]{2}|2[0-4][0-9]|25[0-5])' file.txt) echo $ip
この答えに基づいて私の答えを始める:
はい、使用できるオプションやツールはたくさんあります。私はこれを試したところ、うまくいきました:
ifconfig | grep -oE "\ b([0-9] {1,3}。){3} [0-9] {1,3}\b" aなので、grep -oE "\ b([0- 9] {1,3}。){3} [0-9] {1,3}\b "と出力からIPアドレスをgrepします。
そして答えを完全なIPv6などに変換します...:
fgrep -oE "\b([0-9A-Fa-f]{1,4}:){7}[0-9A-Fa-f]{1,4}\b" -- file
/ nnnがある場合にそれを保持したい場合:
fgrep -oE "\b([0-9A-Fa-f]{1,4}:){7}[0-9A-Fa-f]{1,4}(/[0-9]{1,3}){0,1}\b" -- file
また、「::」を含むIPv6の短縮バージョンもあります。
その他のIPv6の回答については、こちらをご覧ください。 https://stackoverflow.com/questions/53497/regular-expression-that-matches-valid-ipv6-addresses
ファイルにIPのリストが1行に1つある場合、grep
にはすでに便利な-f
オプション:
$ man fgrep | grep file= -A1
-f FILE, --file=FILE
Obtain patterns from FILE, one per line. The empty file contains zero patterns, and therefore matches nothing. (-f is specified by POSIX.)
これにより、文字列が別のIPになるオプションが後に続くため、いくつかの誤検知が発生する可能性があります。あなたが心配するかどうかにかかわらず、あなたがそれについてできることがたくさんあります。
ip -4 addr show eth1 | grep -oP '(?<=inet\s)\d+(\.\d+){3}'
その出力をいくつかのoutputFile
にリダイレクトします
単純にgrep
のパターンで、
grep -sE "159.143.23.12|134.12.178.131|124.143.12.132" <outputFile>
私は別の投稿への私の答えがここにより適していると思います。この投稿と他の人たちのおかげで、私はこれを思い付きました。正しいIP形式を探し、256以上のすべての行を削除します。代わりに、IPを無効なものに置き換えて、出力が表示されないようにします。
echo '255.154.12.231' | grep -E '(([0-9]{1,3})\.){3}([0-9]{1,3}){1}' | grep -vE '25[6-9]|2[6-9][0-9]|[3-9][0-9][0-9]'
最初のgrepはおそらくこの投稿で見つかり、X.X.X.Xの形式で0〜999の数値をチェックします
2番目のgrepは256〜999の番号の行を削除し、有効なフォーマットのIPのみを残すため、
しかし... G-Manによって指摘されたように、IPが独自のライン上にあると想定して、私はエラーになりました。ただし、ほとんどの場合、IPの両側にスペースまたは別の仕切りがあります。スペース/ディバイダーは、IPが見つかった後、sedまたはその他の方法で削除できます。また、最初のgrepに-oを追加しました。
echo ' 1234.5.5.4321 ' | grep -Eo ' (([0-9]{1,3})\.){3}([0-9]{1,3}){1} ' | grep -vE '25[6-9]|2[6-9][0-9]|[3-9][0-9][0-9]' | sed 's/ //'
echo ' 234.5.5.432 ' | grep -Eo ' (([0-9]{1,3})\.){3}([0-9]{1,3}){1} ' | grep -vE '25[6-9]|2[6-9][0-9]|[3-9][0-9][0-9]' | sed 's/ //'
echo ' 234.5.5.100 ' | grep -Eo ' (([0-9]{1,3})\.){3}([0-9]{1,3}){1} ' | grep -vE '25[6-9]|2[6-9][0-9]|[3-9][0-9][0-9]' | sed 's/ //'
1番目と2番目は何も出力しませんが、3番目と2番目は削除されます。
これが短い形式です
grep -oE "\b(\d{1,3}\.){3}\d{1,3}\b"
\ dは数字[0-9]