• ベストアンサー

bashでのif文内正規表現についての

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 わかる方お教えください。

質問者が選んだベストアンサー

  • ベストアンサー
  • kumoz
  • ベストアンサー率64% (120/185)
回答No.2

文字クラスに誤解があると思います。[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]))$"

boonie777
質問者

お礼

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

その他の回答 (2)

  • notnot
  • ベストアンサー率47% (4834/10234)
回答No.3

詳しい説明をし出すときりがないですが、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

boonie777
質問者

お礼

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

  • mekanik
  • ベストアンサー率26% (4/15)
回答No.1

こんにちは。 bash で上記のような正規表現ができるかどうかは、わかりません。 しかし、 以下で同じことにはなりませんでしょうか? netstat -rn | awk '{ print $1 }' | grep "192.168.1.[1-128]"

boonie777
質問者

補足

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

関連するQ&A

  • 正規表現の使い方

    正規表現の使い方で困っています。 lsでディレクトリの中身を確認して、その名前とひっとするものがあれば、IFの中に入りたいのですが、エラーが出てしまいます。 正しい書き方をご存じのかたご回答のほど宜しくお願いします。 set `cat /DS/tmp/liste.fal |grep -v \#` for i do verz=$(dirname $i) set `ls $verz` for j do if (test $j = "Kommentar.txt") then echo "$j ist jetzt Kommentar.txt" echo "cp $j $zielverz" elif [[ "$j" =~ "*fal" ]] then echo "$j ist jetzt *.fal" echo "cp $j $zielverz" と続いていくのですが、[[ "$j" =~ "*fal" ]] この部分が間違っているようです。 シンタックエラーがでます。 私が検索したいファイル名はのようなかたちです。 riipe.fal フォルダの中には、他にも rippe.fal.neu rippe.erg.fal.neu Kommentar.txt という名前のものがあります。 宜しくお願いします。

  • メニュー画面よりコマンド実行して結果表示する

    シェルスクリプトでメニュー選択画面より選択してコマンドを実行して結果を表示する。 エンターキーを押して再度メニューに戻る。 そういうスクリプト作成したいのですがうまくいきません。 下記では何が誤っていて不足しているのでしょうか? 正しい構文を教えて下さい。 ・・・誤りばかりと思いますがすいません。 #!/bin/bash PS3="メニューを選択して下さい。" select ans in "$ans1" "$ans2" "$ans3" "終了!"; do $ans1="ifconfig" $ans2="df " $ans3="netstat " if [ -z "$ans1" ]; then echo " $ans1." read ifconfig clear; while :; do echo -n "^[[1;1H"; ifconfig ; sleep 1; done if [ -z "$ans2" ]; then echo " $ans2." read df clear; while :; do echo -n "^[[1;1H"; df ; sleep 1; done if [ -z "$ans3" ]; then echo " $ans3." read netstat clear; while :; do echo -n "^[[1;1H"; netstat ; sleep 1; done else break fi case "$ans" in "終了!") break;; "") echo "終了";; *) esac done echo "Good bye."

  • While 二重ループ処理について

    Bashのシェルスクリプトでwhileを使いループの処理を行いたい。 現状以下のようにファイルAの中に値”1”とイコールの場合に$awkを表示しています。 これを値”1”部分へファイルBの中の値を順にチェックできるようにしたいのです。 while IFS="$LF" read $READ_R record; do IFS='; ' set -- $record for awk in $3; do if [ "$awk" == "1" ]; then for awk in $4; do echo "$awk" done fi done done < "$1" 初心者のため分かり難い質問かもしれませんがよろしくお願いします。

  • bashのif文で構文エラー:

    bashで時間の比較によっての分岐を考えています。 ネットで検索しながらif構文を下記のようにしてみているのですが、 行 10: 構文エラー: 予期しないファイル終了 (EOF) です となってしまいます。 どなた様かお教え願えませんでしょうか #!/bin/bash DATA=`date +%-H%M` if [ $DATA -gt 600 ];then echo "$DATA" else echo "NG" fi 

  • 正規表現でのマッチング

    連想配列%hushがあります。 %hushの中のキーが「a何とか」、つまり a0、a1、a2、a3、・・・ の値だけを、配列@arrayに格納します。 つまり  $array[0]=$hush{'a0'}  $array[1]=$hush{'a1'}  $array[2]=$hush{'a2'}  $array[3]=$hush{'a3'} ・・・ といった感じにしたいのですが、 「a何とか」は正規表現を用いて  a.* と表現できます。 ってここまでは手元の本で分かったのですが、マッチングのif文をどう書けばいいんだよ!  if($key==a.*) と書いてもうまくマッチしてくれないんで、a.*を""で括ってみたり()で括ってみたりするものの相手にされず・・・ 手元の本は「こういう場合正規表現ではこう書けば良くて、これをマッチングさせれば良い」みたいなことを書いていますが、マッチングのさせ方は書いていません。 プログラムの文法書を読むと、条件分岐の仕方は書いていますが、==演算子の右側が正規表現だった場合の使い方は書いていません。 あるいは、正規表現の場合のマッチングはif文などを用いないのでしょうか? だったら正規表現の本にマッチングの文法を書いていますよね!? なんだかんだでマッチングがうまくいかないのです。 この場合、どう記述すればいいのでしょうか? お手数をお掛けします。

  • これは正規表現とは言えないでしょうか?

    正規表現を勉強しようと思っているのですが まずはじめに確認させて下さい。VBAです。 Sub 正規表現() If a Like "*a*" Then End If End Sub は正規表現とは言えないでしょうか? *を使っているからそう思いました。 Dim re As RegExp Set re = New RegExp を使わないと、正規表現といえないのでしょうか? よろしくお願い致します。

  • awk外で宣言した変数の参照

    kshを使用して、以下のようなシェルを作成しています。 しかしawk内で$iと$iiが参照出来てない様子です。 どのようにすれば参照できますでしょうか。 ■シェルの中身 #/usr/bin/ksh for i in `cat /tmp/hoge |awk -F : '{ print $3 }' | sort | uniq -d` do if [ $i != "" ]; then for ii in `cat /tmp/hoge` do echo $ii |awk -F ":" '{ if ( $3 -eq $i ) print $ii }' done fi done ■エラー awk: 0602-562 フィールド $() が正しくありません。 入力の行番号は 1 です。 ソースの行番号は 1 です。

  • ASP言語での正規表現の書き方

    if instr(hoge,"Android 4.2.2; ")>0 then 上記のifで4.2.2の数字が変わっても拾えるよう正規表現で記述したいです。 どう書けばよいですか? ASP言語で正規表現を使った事が無いので、使用できるのかも判りません。 宜しくお願い致します。

  • ifステートメントで表現したいのですが、

    65以上、90以下ならをifステートメントで表現したいのですが、 If i >= 65 And i <= 90 Then endif であってますか? もっとスマートな書き方があった気がしたのですが・・・

  • 正規表現の中の変数の中の演算子

    perlで正規表現を使おうとしています。 確認したい文字列は変数にしており その文字列には「?」が含まれています。 ------------------------ $str = "文字列" $exp = "test?aaa=bbb"; if ($str =~ /^sss.*${exp}$/){ #do something } ------------------------ これだと、ヒットしません。。 $expを"test\?aaa=bbb"にすることもできません。 正規表現にはこだわりません。 どうしたら、うまくマッチングできますかね。。 なにか案があれば教えてください。

    • ベストアンサー
    • Perl