• ベストアンサー

Linuxのsedコマンドについて

sedコマンドを使いIPアドレスを切り取りたいと考えています。 IPアドレスは4つの区切りで表示されますがこれをcutではなくてsedで処理したいと考えています。 この場合どのオプションを使えばよいのでしょうか?

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

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4848/10262)
回答No.6

> 例)91.384.203.39 - - [29 May/2003~] ~~ > となっていますが最初のカンマで区切られているIPアドレスを除きたいと考えています。 それはIPアドレスじゃないという突っ込みもありますが、それだけであれば、先頭から最初の空白までを削除すると言うことなので、 sed -e 's/^[^ ]* //' または空白を残すなら sed -e 's/^[^ ]* / /' で。

その他の回答 (5)

回答No.5

ファイルに上書きしたい場合は、オプション -i と -eをつけて以下のような形で使えば上書きできるかと思いますので、お試しください。 sed -i -e "s/[0-9]\+\(\.[0-9]\+\)\{3\}//g" test.txt

回答No.4

結果をさらに加工したいのであればパイプで渡しましょう cat ファイル名|sed 's/正規表現//g' | mail -s "sed result" パイプで渡せない場合もあります。その時は xargs -i の出番です。 例)ls で一覧調べて jpg と名のつくファイルをmvしたい ls |grep "jpg" |mv あれ!? ↑これはできません そんなときは ls |grep "jpg" | |xargs -i mv '{}' ../dust3 結果に対して毎行 mvを実行します。その際の一行は '{}' に入ります。 cat ファイル名|sed 's/正規表現//g' | xargs -i touch '{}' なんてやれば結果の名前をもったファイルがかずぶんできちゃいます。

回答No.3

例で出して頂いている、 91.384.203.39 - - [29 May/2003~] ~~ IPアドレスじゃないですよね・・・・ sed 's/\(\(1\?[0-9][0-9]\?\|2[0-4][0-9]\|25[0-5]\)\.\)\{3\}\(1\?[0-9][0-9]\?\|2[0-4][0-9]\|25[0-5]\)//g' 厳密にIPアドレスだけを正規表現で消去しています。 なので例示いただいた、「91.384.203.39」は私のでは消えません。

回答No.2

こんにちは。 以下のの内容がtest.txtに記載されていると仮定した場合、で回答させていただきます。 【test.txtのデータ】 91.384.203.39 - - [29 May/2003~] ~~ 191.384.203.39 - - [29 May/2003~] ~~ 291.384.203.39 - - [29 May/2003~] ~~ 91.384.203.39 - - [29 May/2003~] ~~ 91.384.203.39 - - [29 May/2003~] ~~ 91.384.203.39 - - [29 May/2003~] ~~ 91.384.203.39 - - [29 May/2003~] ~~ 【回答】 sed "s/[0-9]\+\(\.[0-9]\+\)\{3\}//g" test.txt 【実行結果】 - - [29 May/2003~] ~~ - - [29 May/2003~] ~~ - - [29 May/2003~] ~~ - - [29 May/2003~] ~~ - - [29 May/2003~] ~~ - - [29 May/2003~] ~~ - - [29 May/2003~] ~~ 参考になれば幸いです。

shiro857
質問者

補足

回答有難うございます。 sedの後に -eをつけてその後にスクリプトを書くことは可能ですか? sed -e の形で書き換えたいと思っといるのですが

回答No.1

入ってくる文字列と加工後の希望文字列の例を教えて下さい。

shiro857
質問者

補足

このような形になっています。 例)91.384.203.39 - - [29 May/2003~] ~~ となっていますが最初のカンマで区切られているIPアドレスを除きたいと考えています。 これはsedオプションのdでできるのでしょうか?

関連するQ&A

  • sedコマンドについて

    sedコマンドについてご存知の方いたらお願いします。 cn: main=bread, fruit=apple, drink=coffee, dessert=cake といった文字列があった場合、 fruit=apple だけを「sed」コマンドを使用して 表示あるいはファイルへ出力する方法を教えていただけないでしょうか。 よろしくお願いします。

  • grep,sedコマンドについて

    昨日に引き続き、またまた質問です。 昨日回答してくださった方、ありがとうございました。 その後自分でも色々勉強しまして、ファイルの中身を処理するにはgrepコマンドとsedコマンドが 有効である事が分かりました。 今回やりたいことは以下のファイルの数字と時間の部分(//のついている2行)の削除です //1 //00:00:03,600 --> 00:00:07,195 xxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxx //2 //00:00:07,360 --> 00:00:09,635 xxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxx     ・     ・ (実際のファイルには"//"はついていません) 理想の出力 xxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxx (xxxxxの部分には英語の台詞が入ります) で、以下が自分が考えた方法です 1.sedコマンドのみで削除 $ sed "/[0-9]*\n[0-9][0-9].*/d" ファイル名 結果 ファイルの内容がすべて表示されるだけ (a) 2.grepコマンドで抽出しパイプ処理 まずgrepで削除部分を抽出 $ grep -P "^[0-9]*\n[0-9][0-9].*" ファイル名 結果 1    00:00:03,600 --> 00:00:07,195    2    00:00:07,360 --> 00:00:09,635         ・         ・    10    11         ・         ・ となり、1~9までの数字と時間はちゃんと表示され 10以降は数字しか出ません。 (b) また -P の部分を -E にすると、何も表示されません (c) (perlの正規表現と拡張正規表現の違いはここでは無いように思えますが・・・) 2は最初でつまづいたのでどのコマンドに渡して行を削除するかはまだ分かりません (d) 削除の際、2行まとめて行うのは、一行ずつ行うと、台詞の部分に数字のみが入っていた場合 削除されるのを防ぐためです 以上長くなりましたが(a)~(d)の質問、疑問に回答していただけると嬉しいです。 よろしくお願いします。

  • solarisのシェルについて(sedコマンド)

    こんにちわ solarisのBシェルを現在使用しているのですが、 sedコマンドを使用して"を消したいのです。 具体的には # cat /tmp/test.log |sed | sed -e "s/"//g" というようなコマンドを打ちたいのですが、 この場合はどのようにすればよいのでしょうか? よろしくお願いします。

  • sedコマンド置換について(マッチした数字を演算に再利用したい)

    こんにちは Linuxのsedコマンドについて質問させてください。 軽く検索をかけたりUNIXのコマンド本を調べましたが、わかりませんでした。 例えば正規表現でマッチした数字を2倍して返す処理をする場合 perlではhogeという文字列に対して  hoge=~s/(\d+)/$1*2/g; このような処理で実現できると思います。 このように今マッチしたものに対して何か処理を行って置換するということは sedコマンド、もしくはそれを使ったシェルスクリプトで処理することは可能でしょうか? sedの方が処理速度が速いので、こちらを使いたいのです。

  • sed コマンドについて

    はじめまして 当方、初心者で勉強の身です。ご回答頂けたら幸いです。 linuxのシェルファイルが100以上あり、こちらの全ファイル内に含まれる文字列"ABCDE"を文字列"12345"に置換をしたいと思っています。 sed コマンドで sed -e "s/ABCDE/12345/g" *.csh のように実行しても、画面上に変換後が表示されるだけで その後、ファイルを見ても置換されていません。 どのようにすれば、全ファイルが修正されるのでしょうか。 以上です。回答の方をよろしくお願い致します。

  • sedコマンドで指定の行まで削除

    sedコマンドで1行目から、例えば「FLAG」と書かれた行までを削除したい場合どう書けばよろしいでしょうか。 sedコマンド以外に有用なコマンドがあれば、そちらも教えていただきたいです。 よろしくお願いします。

  • sedコマンドでのエスケープ文字の扱い

    はじめまして。Linuxのsedコマンドで困っています。 sedの置換文字列として連続する\をリテラルとする処理を考えていますが、\がいくつ入ってくるか(変数)、わからない場合において、複雑な処理なしに対処できないか、考えています。 ↓簡単な例ですが、コマンドベースで説明すると以下のようなものです。 $ var='\\' $ cat file.txt aa $ sed "s/.*/$var/" file.txt \ という結果になりますが、置換文字を変数から取る際に、連続する\が設定されるケースを想定したプログラムを組むたいと思っています。 \が入ってくる個数がわかるのであれば、\を2倍にセットしておけばできそうですが、いくつセットされてくるかはわからない場合、何かよい方法はないでしょうか。 念のため、Linux環境で、GNU sed 4.1.2版で試行しています。シェルはbashです。よろしくお願いします。

  • linuxのコマンドについて

    linuxのコマンドについて honey34,123 234,honey23 32,honey56 honey12,34 など、,の左側にhoney数値 右側に数値 もしくは ,の右側にhoney数値 左側に数値 が並んだテキストデータがあります。 このなかから数値の列だけを取り出したいのですが、どうしたいいでしょうか。 cutコマンドやsedコマンドの組み合わせを試してみましたがだめでした。

  • hp-uxのsedコマンドについて教えてください

    hp-uxのコマンドで困っております。 どなたか知恵をお貸しいただけたらと思います。 あるファイルより条件に合致する特定の文字列の置換を行い別のファイルとして保存したいと考えております。 このときに以下のsedのコマンドを利用しているのですが、一部上手くいかなくて難儀しております。 コマンド(※文字列の前後にわかりやすく<>を付けていますが実際には入力しません) sed "/<文字列(1)>[^0-9]/"s"/<文字列(1)>/<文字列(2)>/"g aaaa.txt > bbbb.txt コマンドの内容 aaaa.txtの中を検索し文字列(1)かつ文字列(1)のすぐ後ろの文字が数字でない場合(例えばIPアドレスで10.xxx.xxx.1というIPアドレスを置換したい場合に10.xxx.xxx.10や10.xxx.xxx.100を含めないようにする場合です)、文字列(1)を文字列(2)に置換しbbbb.txtに保存する。 (※上記コマンドのみだと条件に合致する文字列のたびにbbbb.txtが上書きされるため一番最後の条件に合致する文字列しか置換されませんので、実際にはコマンドのたびにbbbb.txtをaaaa.txtに上書きコピーするステップを入れています) この際、困っておりますのが元ファイルaaaa.txtにある各行の文字列が以下の場合に認識がされず置換が行われない点です。 (1)10.xxx.xxx.1<タブ>xxxxxxxxxの場合(※条件に合致する文字列のすぐ後ろにタブ文字が入っている場合) (2)10.xxx.xxx.1<改行>の場合(※条件に合致する文字列のすぐ後ろが改行となっており同一行にそれ以上文字が存在しない場合) 上記の(1),(2)のような行は置換が行われず、元の値のままとなってしまいます。 これらを解決する方法がありましたらよろしくお願いいたします。

  • sedコマンドの置換パターン条件について

    シェルスクリプトについて質問です。 /etc/ssh/sshd_configのAllowUsers行にユーザを追加&削除、sshdをリスタートするスクリプトを作っています。 ユーザ追加の処理はsedコマンドで実現できました。 sed -i -e "s/^AllowUsers/AllowUsers $USERNAME/" $CONF_FILE そして、悩んでいるのがユーザ削除時の処理です。 "AllowUsersで始まる行の中で" 且つ "変数$USERNAME" に一致する部分を削除するという処理です。sedは複数条件を指定することもできますが、以下記述の場合、2つの条件が独立して処理されてしまいます。 sed -e "s/^AllowUsers/AllowUsers/" -e "s/ $USERNAME//" $CONF_FILE ($USERNAMEに一致する部分はAllowUsersで始まらない行でも置換される) sedにAND条件のような使い方は可能でしょうか。 環境はCentOS 5.3、シェルはbashを使っています。 よろしくお願いいたします。