配列を使っての文字列抽出について

このQ&Aのポイント
  • コマンドラインから実行されたnetstat -rnf inetコマンドの結果に含まれるUHSの文字列を抽出するためのPerlスクリプトを作成していますが、うまく結果が得られません。
  • スクリプトの正規表現が間違っている可能性があります。具体的には、9行目の正規表現パターンが誤っている可能性があります。
  • 正しい正規表現パターンを使用して、目的の文字列を抽出する方法についてのアドバイスをお願いします。
回答を見る
  • ベストアンサー

配列を使っての文字列抽出について

よろしくお願いします。 コマンドラインから >netstat -rnf inet を打つと下の結果が表示されました。 ***************** Routing tables Internet: Destination Gateway Flags Refs Use Netif default 192.168.AA.B UGSc 20 5 en0 127 127.0.0.1 UCS 0 0 lo0 127.0.0.1 127.0.0.1 UH 10 1948 lo0 169.254 link#4 UCS 0 0 en0 192.168.AA link#4 UCS 2 0 en0 192.168.AA.B 0:A:BB:CC:DD:EE UHLW 20 70 en0 192.168.AA.C 127.0.0.1 UHS 0 0 lo0 192.168.AA.DD link#4 UHLWb 3 47 en0 ***************** ここから、10行目の3項目「UHS」の文字列だけを取出したく、 次のPerlスクリプトをくみました。 1:open(IN,`netstat -rnf inet`); 2:while(<IN>){ 3: next if /Routing.*/; 4: next if /\s/; 5: next if /Inter.*/; 6: next if /Desti.*/; 7: next if /default/; 8: chomp; 9: @A=split(/\s/ + / UHS /,IN); 10: print @B."\n"; 11:} 12:close IN; しかし、欲しい結果が得られません。 正規表現が間違っている事まではなんとか辿り着いたのですが、 どのように書いたら良いのか分かりません。 (3 - 7行目と、9行目) どなたか教えて頂けませんでしょうか。 よろしくお願いいたします。

  • aopoma
  • お礼率95% (123/129)
  • Perl
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
  • qtea
  • ベストアンサー率77% (38/49)
回答No.1

>4: next if /\s/; この場合、空白か改行がふくんでいれば、nextします。 なので、次行以降は処理されません。 たぶん、 next if /^$/; でいけるのではないかと。 >9: @A=split(/\s/ + / UHS /,IN); これは、if文の書きかたからすると、 @A=split /\s+/; くらいで良いのではないでしょうか? (@A=split(/\s+/,$_);と同じ意味です) >10: print @B."\n"; @Bって…@Aの間違えですよね? print @A."\n"; かな。 ただ、「.」で連結してしまうと、@Aをスカラーで評価してしまうので、@Aの個数を表示することになってしまいます。 せめて、ピリオドではなく、カンマくらいにしときましょう。 たぶん意図するものは、 print $A[2]."\n"; なのではないかと。 他はたぶん、大丈夫そうな感じです。 個人的には、 >3: next if /Routing.*/; これは、 next if /^Routing.*/ か next if /^Routing/ と、行頭にマッチする、としたいですが…(他のとこもね)

aopoma
質問者

お礼

ご返答ありがとうございます。 遅くなってすみません。 正規表現をいろいろと変えていたら何とか出来ました。 このあたりはややこしいですね。 ありがとうございました。

関連するQ&A

  • アクティブなインターフェースのシステム情報の取得方法につきまして

    FreeBSD(MacOS X)を使用しています。 >netstat -rnf inet を実行します。結果は次のようになります。 ******************************** Routing tables Internet: Destination  Gateway  Flags  Refs  Use  Netif  Expire default 11.33.55.7 UGSc 38 469 en0 11.22.33/44 link#4 UCS 1 0 en0 11.22.33.4 0:0:11:22:33:44 UHLW 30 0 en0 「Netif」が「en0」か「en1」になっていたら、 アクティブと判定し、この全体を配列に入れます。 => my @NS=`netstat -rnf inet`; 次に、 $NS[0]=Routing tables $NS[1]=空白 $NS[2]=Internet: $NS[3]=Destination  Gateway  Flags  Refs ・・・ $NS[4]=default 11.33.55.7 UGSc ・・・ $NS[5]=11.22.33/44 link#4 UCS ・・・ ・・・ と別々の配列か変数に入れて散らばっている文字列をキチンと 格納したいのですが、その仕方がまず分かりません。 格納したら、 分岐で「en0」があればそれに対する情報を引出したいのです。 やっかいなのが、ipはnetstatでは無くifconfigなのです。 >ifconfig -aで、 ********************** en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> inet 11.22.33.44 netmask 0xffffff00 broadcast 11.22.255.255 ether 00:11:22:33:44:55 と表示されるのですが、,や:や;とバラバラの文字列群を どう処理したら良いのかも分からないのです。 いったん全部を配列に入れて、各行を別々の配列に入れて、 ソートして、ifで分岐して・・としているですが、成功しません。 よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • Excel2003で他の列のデータをドロップダウンリストに

    質問のし直しです。 下記の場合、B列でのドロップダウンリストに(aa bb cc dd ee)と表示させるには、どうしたら良いのでしょうか? A列  B列 bb     dd aa     ee bb     ee cc    dd aa bb 実際には文字列なのですが、1300行で、A列のデータは300個位在ります。 宜しくお願い致します。

  • Excel マクロ VBA セル内で改行された文字列の分割

    はじめまして。 ExcelのVBA初心者で、ちょっと困っています。 (例) (1) セルA1に以下のような改行された文字列が入力されています。 【セルA1】 a aa aaa b bb bbb (2) セルA1内の文字列を3行毎に分割し、セルA2以降に表示させたい。 【セルA2】 a aa aaa 【セルA3】 b bb bbb ※ 今回の例ではセルA1に6行しかありませんが、実際に行数は決まっていません。 そこで以下のようなVBAを見よう見まねで作り、1行毎の分割はうまくいったのですが、『3行毎に分割』ができません。 Sub 分割() Dim A, B, C A = Split(Range("A1"), Chr(10)) B = 0 For Each C In A B = B + 1 Range("A2").Offset(B - 1, 0).Value = C Next End Sub ご教授いただけると助かります。 よろしくお願い致します。

  • ExcelVBAでの配列処理について

    処理速度向上を目的に配列を利用したいのですが、結果の書きだし処理で悩んでいます。 Dim aa(10000,2) as Double for i = 1 to 10000 for j = 1 to 2 aa(i,j)=Rnd() next j next i 上記の処理で、10000行と2列の乱数表データが配列として出来、そのデータをシートに書き出しするときに、列を2つほど飛ばして書き出したいのですが、どうすればよいのでしょうか? range("A1:B10000") = aa  という連続した列ではなく、A列に1万行、D列に1万行書き出したいと思っています。 処理速度を向上させたいので、またFor分処理するのではなく、一気に書き出したいと思っています。 ご教授のほどよろしくお願い申し上げます。

  • 文字列の取り出し方

    今、Visual Basic 2008を使用しています。 textbox2とtextbox3があり、textbox2に複数行にまたがる文字列があります。 この文字列の中で、listbox1の中にある項目の文字列が入ってる場合はカンマ区切りで文字列の後ろにつなげたいのですが、うまくいきません。 具体的には あいうえお あかさたな いろはにほ というtextbox2の内容について、listbox1内に あ い という2つの項目があった場合、 あいうえお,あ,い あかさたな,あ いろはにほ,い という結果をtextbox3に書き出すという内容です。 Dim addtag As String = "" Dim i As Integer For Each part As String In TextBox2.Text.Split(vbCrLf) If part <> "" Then For i = ListBox1.Items.Count - 1 To 0 Step -1 If part.Contains(ListBox1.Items(i)) = True Then addtag = addtag & "," & ListBox1.Items(i) End If Next part = part & addtag TextBox3.Text = TextBox3.Text & part & ControlChars.NewLine part = "" addtag = "" End If Next というプログラムを組んでいますが、どこが間違っているのかわからず、煮詰まってしまいました。 プログラムは初心者で、根本から違っていたら恥ずかしい限りですが、どうかよろしくお願いします。

  • リストに一致した列に同じ値か1を返す方法

    散々調べましたが、一向に解決しないため教えて下さい。 セルAA1~AZ1に『あ』から順に『は』まで入っているとします。 たとえば、   A  B  C  D  E  F  G・・・ 1 2 い  さ  た 3 く  す  て  に  は 4 た  ぬ 5 あ  え  か  け  さ  せ  と 6 こ このような状態になっているとき、 2行目の『い、さ、た』を、リストAA1~AZ1と一致する同じ行内(この場合、AB2、AK2、AP2)に それぞれ『い』『さ』『た』か、若しくは1を返したいと思っています。 量が少ないのなら手作業でやってもいいかな・・・と考えたのですが、 1000件ぐらいあるため、何かいい方法はないものかと思っています。 関数で『=if(A2="あ",1,if(B2="あ",1,if(C2="あ",1,if(D2="あ",1,if(…省略…)』 というのをAA2に入れるというのを作ったのですが、 例のように数多くあると式が長くなりすぎるのかエラーになってしまいます。 マクロか関数などで何とか処理できないものでしょうか。 すみませんが、よろしくお願いします。

  • エクセル2003のVBAを教えて

    エクセル2003のVBAを教えてください。 次の対象データで、(1)(2)(3)の作業が出来るエクセルVBAを教えて下さい。 (1)(2)(3)個々のVBAでお願いします。 ●対象データ:種類(A列)、文字(B列)、    データの行数:不特定なので、データのある最終行までとします。 ●教えていただきたい項目  (1):種類だけを(C列)に取り出す。  (2):種類の先頭に空白の行を3行入れて、追加の2行目の種類(A列)に文字(B列)を入れる。  (3):種類が5行以上あるときは、5行ごとに空白行を追加する。 ●対象データ 種類(A列)   文字(B列) AA       あああ BB       いいい BB       いい BB       いいい CC       うう CC       うう DD       ええええ DD       ええええ DD       ええええ DD       ええええ DD       ええええ DD       ええええ DD       ええええ ●(1)のVBAの結果(このようになるVBAを教えてください。) (C列) AA BB CC DD ●(2)、(3)のVBAの結果(このようになるVBAを教えてください。) 種類(A列)    文字(B列) あああ AA        あああ いいい BB        いいい BB        いいい BB        いいい うう CC        うう CC        うう ええええ DD        ええええ DD        ええええ DD        ええええ DD        ええええ DD        ええええ DD        ええええ DD        ええええ

  • アクセスでデータ抽出

    A列に数字が、B列にデータ、C列には○と×が入っています。 A列は同じ数字が複数行あることもあり、 同じ数字でも○の時と×の時があります。 A列が同じ数字であるものを1グループとすると、C列の行ががすべて○のグループだけを抽出したいのです。 A列 B列 C列    123 aa  ○ 123 ab  ○ 123 zs  ○ 325 dd  ○ 325 dg  × 500 ff  ○ (上の場合、A列が123と500の行を抽出したい) どうしたらいいでしょうか? できればプログラムではなくクエリなどの操作でお願いします。

  • 特定の文字列を除いた配列の作成マクロについて

    頭書の件、現在マクロで以下のようなことを行おうとしており悩んでおります。 皆様のお知恵を拝借いたしたく、お願いいたします。 エクセルのSheet1に以下のような形でデータが格納されております。 A行:文字列、B行:数字でそれぞれ60000個程度のデータ格納されております。 この中から、特定の文字列を含んだ列を全て削除したデータを配列に格納するマクロを作成したいと考えています。 「特定の文字列」は、例えば"山田", "佐藤", "田中"の3種類とします。 もし上述の文字列のいずれかを含んだデータが30000個あれば、削除後の30000個程度のデータを新しい配列に格納したいと思っています。 イメージ的には以下のような操作がしたいのですが、「If C(i, 1) <> List Then」では通らないので、この部分に該当するような操作をなにかしらの方法で表現できましたらご教授いただけると助かります。 Sub test() Dim C As Variant Dim D As Variant Dim i As Long Dim j As Long Dim List As Variant List = Array("山田", "佐藤", "田中") C = Worksheets("Sheet1").Range("A1", "B6000") For i = 1 To 60000 If C(i, 1) <> List Then D(j,1)=C(i,1) D(j,2)=C(i,2) j=j+1 Else End If Next End Sub お手数をおかけいたしますが、宜しくお願いいたします。

  • アドレス サブネットマスク デフォルトゲートウェイアドレスがわからない。

    よく、本で、アドレスなどが、192.168.1.xx とか192.168.0.xxとかかかれています。 しかし、ifconfigでしらべたところ、 [root@yuyu ~]# ifconfig eth0 Link encap:Ethernet HWaddr xx:xx:xx:xx:xx:xx inet addr:221.104.16.79 Bcast:221.104.19.255 Mask:255.255.252.0 inet6 addr: fe80::200:e2ff:fe78:e84e/64 Scope:Link [root@yuyu ~]# netstat -rn Kernel IP routing table Destination Gateway Genmask Flags MSS Window irtt Iface 221.104.16.0 0.0.0.0 255.255.252.0 U 0 0 0 eth0 169.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0 0.0.0.0 221.104.19.254 0.0.0.0 UG 0 0 0 eth0 このように、192.168ではじまらないのです。すごく不審です。 わたしは、今自動でIPを割り当てられるようになっています。 固定のIPアドレスを設定したいので、ルーターのIPアドレスを知りたいのですが、上記のものがIPアドレスであってるんでしょうか? 勉強不足ですが、どなたかなにか知ってることがあれば教えて下さい。

専門家に質問してみよう