web-dev-qa-db-ja.com

シェルスクリプトを使用してファイルにIPアドレスが存在するかどうかを確認する方法

出力を生成するスクリプトがあります。次のような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があります。

14
Koshur

はい、使用できるオプションやツールはたくさんあります。私はこれを試したところ、うまくいきました:

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できます。

29
Ijaz Ahmad Khan

ファイルの名前が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
2

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

2
Ganapathy

この答えに基づいて私の答えを始める:

はい、使用できるオプションやツールはたくさんあります。私はこれを試したところ、うまくいきました:

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

2
Bryan Ritter

ファイルに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になるオプションが後に続くため、いくつかの誤検知が発生する可能性があります。あなたが心配するかどうかにかかわらず、あなたがそれについてできることがたくさんあります。

0
chutz
ip -4  addr show eth1 |  grep -oP '(?<=inet\s)\d+(\.\d+){3}'
0
Smit Jain

その出力をいくつかのoutputFileにリダイレクトします

単純にgrepのパターンで、

grep -sE "159.143.23.12|134.12.178.131|124.143.12.132" <outputFile>
0
Keyshov Borate

私は別の投稿への私の答えがここにより適していると思います。この投稿と他の人たちのおかげで、私はこれを思い付きました。正しい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番目は削除されます。

0
eyez

これが短い形式です

grep -oE "\b(\d{1,3}\.){3}\d{1,3}\b"

\ dは数字[0-9]

0
k_vishwanath