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


13

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


grep、egrep、awk、またはsedなど、好きなものを使用してください
Ijaz Ahmad Khan

構文を手伝ってくれませんか?つまり、ランダムIPをどのように検索するのかということです。パターンの記述方法は?特定のアドレスではなく、任意のIPアドレスを探しています。
コシュール

5
それは、4進表記のIPv4アドレスのみですか?彼らは次のように書くことができ0010.0000.0000.0001ますか?それ以外の場合、ファイルには、バージョン番号(soft-1.2.1100.1.tar.gz、ネットワーク仕様(10.0.0.0/24)、1.2.3.4.5)などのIPアドレスのように見えるものが含まれていますか?333.444.555.666にプラスのソリューションを受け入れますか?または0377.0377.0377.0377(有効なクワッド8進数のIPアドレス)?
ステファンシャゼル16

bash利用可能な場合は、awk通常も利用できるため、これはあなたのために働くかもしれません:(awk '/([0-9]{2,3}\.){3}/ {print $5 "\t" $1}'このワンライナーは、ホストXFRリストの出力を/etc/hostsフォーマットに変換します。)
マークハドソン

回答:


25

はい、使用するオプション/ツールがたくさんあります。私はちょうどこれを試しました、それは動作します:

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 するために使用できます。


ありがとう。これは動作します。少し説明してもらえますか?これは正規表現ですか?
-Koshur

はい、これはgashでbashで使用される正規表現です。ドットで区切られた3桁のパターンを探しています。あなたは、2つの連続桁のために{1,2}の数値を変更することなどによってで遊ぶことができる
Ijazアーマド・カーン

"\b([0-9]{1,3}\.){3}[0-9]{1,3}\/[0-9][0-9]?"CIDRの検索にも使用できます(有効であると仮定)
vikas027

2

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

はい、使用するオプション/ツールがたくさんあります。私はちょうどこれを試しました、それは動作します:

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


fgrepgrepパターンマッチングを無視するバリアントの古い名前です。私はあなたが使用してお勧めしますgrep(あるいはegrepあなたがはっきりしている、特にとして、代わりに)望んでパターンマッチングを。
ロアイマ

2

たとえば、ファイルが呼び出された場合、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

0

ファイルに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

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

このパターンマッチのみ有効な IPv4の、すなわち、0〜255の範囲。一致したIPのみを抽出する必要がある場合は、上記のコマンドにオプションを追加します。このコマンドをbashスクリプトに、おそらく他のシェルスクリプトにも埋め込むことができます。そして、失敗した場合、x.x.x.xx-oegreptry 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


0

別の投稿への私の答えがここに適していると思います。この投稿などのおかげで、正しい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はおそらくこの投稿で見つかり、XXXX形式の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/ //'

最初のものは何も出力しませんが、2番目のものは出力し、スペースは取り除かれます。


10.0.0.1から10.0.1.244の範囲の500個のアドレスがあるとします。grep「500」のため、2番目の行はその行を破棄します。(ファイル内のIPアドレスがあれば、それ自体が行にあるとは決して言われません。)一方、1234.1.1.1と1.1.1.1234を受け入れます。しかし、それはさておき、悪くはありません。
G-Manが「Reinstate Monica」と言う

-1

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

単純grepにパターンで、

grep -sE "159.143.23.12|134.12.178.131|124.143.12.132" <outputFile>

4
.文字通り正規表現演算子であり、それを処理するためにエスケープ必要
ステファンChazelas

1
これらはパターンではなく、リテラルです。OPは「任意のIP」を指定しているため、有用な回答ではありません。
マークハドソン

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.