アプリ版:「スタンプのみでお礼する」機能のリリースについて

bashでのif文内正規表現についての質問です。

IPアドレスを正規表現にてマッチングさせたいのですが実現できなく困っています。
たとえば192.168.1.の1から128を引っ掛けたいのですがどうすれば実現できますか?

今は下記のように書いていますが、これではだめみたいです。

ARCHKIP=`netstat -rn | awk '{ print $1 }'`
for i in `echo $ARCHKIP`
do
if [[ $i = 192.168.1.[1-128] ]];then
echo "OK"
fi
done

わかる方お教えください。

A 回答 (3件)

文字クラスに誤解があると思います。

[1-128] の文字クラスは、1から 128 までにマッチするのではなく、
1, 2, 8 のいずれかの文字にマッチします。- の両側に複数文字をを指定することはできません。次の
正規表現を試してみてください。(なお、見苦しくなるのでピリオドはエスケープしていません。)

netstat -rn | awk '{ print $1 }' | grep -E "192.168.1.([1-9][0-9]?|1([01][0-9]|2[0-8]))$"
    • good
    • 0
この回答へのお礼

回答ありがとうございました!
数式でなく文字列としてみなければならなかったんですね。

お礼日時:2009/09/04 14:30

詳しい説明をし出すときりがないですが、bashの機能では正規表現は使えません。



ファイルマッチ( ? が任意の一文字、* が任意の文字列、など)が使えます。これを使うと、
for i in $ARCHKIP
do
case $i in
192.168.1.[1-9]|192.168.1.[1-9][0-9]|192.168.1.1[01][0-9]|192.168.1.12[0-8]) echo OK ;;
esac
done

あるいは、前半後半を分割して、
for i in $ARCHKIP
do if [[ ${i:0:10} = 192.168.1. && ${i:10} -ge 1 && ${i:10} -le 128 ]]
then echo OK
fi
done
    • good
    • 0
この回答へのお礼

遅くなりましたが、丁寧にありがとうございました!
一行にまとまっててわかりやすいです。
すべては私の誤解、あらためて恥ずかしーです。

お礼日時:2009/09/04 14:29

こんにちは。



bash で上記のような正規表現ができるかどうかは、わかりません。

しかし、
以下で同じことにはなりませんでしょうか?

netstat -rn | awk '{ print $1 }' | grep "192.168.1.[1-128]"

この回答への補足

回答ありがとうございます。

上記の実行結果では残念ながらだめでした。
netstat -rn | awk '{ print $1 }' | grep -E "192.168.1.[1-128]"
でも192.168.1.192などが引っかかってしまうためNGなようなのです。

補足日時:2009/09/02 13:01
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!