• 締切済み

sed や owk を使ってデータ整形して実行したい。

#netstat -np の実行結果が以下だとして、 unix 3 [ ] STREAM CONNECTED 144244439 111/httpd unix 4 [ ] STREAM CONNECTED 144244388 222/httpd unix 4 [ ] STREAM CONNECTED 144244321 333/httpd unix 3 [ ] STREAM CONNECTED 144244294 444/httpd unix 3 [ ] STREAM CONNECTED 144244096 555/httpd これを sed やowk を使って以下のように出力して実行したいです。。 kill 111 222 333 444 555 shでこれを実現したいのですが、以下の記述で、 #!/bin/bash A=`netstat -np |grep unix | gawk '{ print $8 }'` 以下のような結果は得られました。 111/httpd 222/httpd 333/httpd 444/httpd 555/httpd しかしこれ以降をどうすれば、以下のように整形して実行できるでしょうか。 kill 111 222 333 444 555

みんなの回答

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

xargs を知るとちょっと幸せになれるかも. netstat -np | grep unix | sed -e 's/.* \([0-9]*\)\/httpd$/\1/' | xargs kill とか.

tanpopo012
質問者

お礼

kill 111/httpd ... となってしまいました。。

  • x1va
  • ベストアンサー率26% (802/3006)
回答No.1

> 111/httpd 222/httpd 333/httpd 444/httpd 555/httpd この結果の文字列から/を区切り文字に指定してawkで再度整形すればいいでしょう。 ↓これを後ろに追加して下さい |gawk -F / '{ print $1 }'

tanpopo012
質問者

お礼

うまく切り出せました!ありがとうございました。

関連するQ&A

  • netstat で表示される「UNIX domain sockets」とは?

    RHL4 apache で運用中です。 topコマンドでサーバーを監視していると、最近急に tasksの値が上昇しサーバーが重くなります。 # netstat -np  と打つと・・・ 「Active Internet connections (w/o servers)」の項目と 「Active UNIX domain sockets (w/o servers)」の項目の 2つが表示されますが、以下のように、 「Active UNIX domain sockets (w/o servers)」において 以下のようなものが大量発生していました。これは時間とともに じりじりと増加し、最後にはウェブサーバーが落ちてしまいます。 unix 3 [ ] STREAM CONNECTED 144254692 18819/httpd unix 3 [ ] STREAM CONNECTED 144254672 18850/httpd unix 3 [ ] STREAM CONNECTED 144254551 16862/httpd unix 3 [ ] STREAM CONNECTED 144246713 18401/httpd unix 3 [ ] STREAM CONNECTED 144246706 18864/httpd unix 3 [ ] DGRAM 144246691 13088/httpd unix 3 [ ] STREAM CONNECTED 144246544 18768/httpd unix 3 [ ] STREAM CONNECTED 144246518 18772/httpd unix 3 [ ] STREAM CONNECTED 144246514 18861/httpd unix 3 [ ] STREAM CONNECTED 144245873 13766/httpd unix 3 [ ] STREAM CONNECTED 144245868 18834/httpd unix 3 [ ] STREAM CONNECTED 144245636 18397/httpd unix 3 [ ] DGRAM 144245451 9277/httpd unix 4 [ ] STREAM CONNECTED 144245363 17896/httpd unix 4 [ ] STREAM CONNECTED 144245194 18771/httpd unix 3 [ ] STREAM CONNECTED 144244915 18330/httpd unix 4 [ ] STREAM CONNECTED 144244890 17760/httpd unix 4 [ ] STREAM CONNECTED 144244844 17914/httpd 質問ですが、 1)「Active UNIX domain sockets」 とは、いったい何でしょうか。 また、例えばどういうときに「 httpdの unix sockets 」 は 大量発生するのしょうか。 2)これはdosアタック等の攻撃でしょうか。 その場合、攻撃元IPを特定するにはどうしたらいいでしょうか。 #netstat -np で見る限りでは、「Active UNIX domain sockets」の 項目ではそのPIDに対応したIPが表示されません。 3)それとも、未熟なcgiやphp等のスクリプトが悪さをしているのでしょうか。 その場合、どのスクリプトが元凶なのか、どうやって調べることが できるでしょうか。 #lsof | grep PID で調査できるかとやってみましたが、 アクセス先として表示されるのは、ただのgifファイルだったりして どうもよくわかりません。

  • 実行中のプロセス数をカウントしたい

    ネットで以下コマンドを見つけて実行しました。 ps -ef | grep -v grep | grep httpd 実行結果は/usr/sbin/htpdが9行表示 この9行をカウントしたい為、 ネットで以下コマンドを見つけて実行しました。 ps -ef | grep -v grep | grep httpd | wc 実行結果は『9 72 576』が表示 上記の結果で9のみを表示させるコマンドがあれば 教えていただけないでしょうか。 また、実際にカウントしたいプロセスは以下例のように 半角スペースと()をふくんでおり 上記httpdのようにうまくいきませんでした。 例:test (rei) 半角スペースと()を含んだプロセス数をカウントするコマンドがあれば 教えていただけないでしょうか。

  • コマンドの実行結果が最初の1単語しか表示されない(sh)

    コマンドの実行結果によって条件分岐をしたいのに、 実行結果が一部しか得られず、うまくいきません。 やりたいことは非常に単純で以下だけです。 (1)service httpd status を実行し、 (2)running と言う文字が含まれていれば 「good」 と表示する。 (3)含まれていなければ 「bad」 と表示する。 しかし、例えば以下を実行すると #!/bin/bash A=(`service httpd status`) echo $A 実行結果の最初の1単語「httpd」としか表示されず、 条件分岐に使えません。 コマンドラインから直接 service httpd status と打つと、 httpd (pid 32506 32505 ) is running.. のように表示されます。 どなたか、さらさらっとサンプルをご提示頂けましたら 大変嬉しいです。どうぞ宜しく御願いいたします。

  • sedコマンドをシェルで実行でうまくいかない

    sedコマンドをシェルで実行しようとしています。 sedコマンドの引数がシングルクォートのためうまく出来ずに困っています。 テキスト内の /abc を xxx と変えたいとします。 以下のように作ってみました。 #!/bin/sh a='\/abc' b=xxx sed \'$a/$b\' txt しかし 認識できないコマンドです: '\/abc/xxx' というエラーが出ます。 $aで扱いたい変数は実はもっと長いパスの為、 ぜひ変数を使いたいのですが、うまくやる方法は無いでしょうか。

  • grep -l '#!/bin/sh' * が動作しない

    FedoraCore4 bashで カレントディレクトリの複数の hoge.sh ファイルの中身に #!/bin/sh が書き込まれているファイルを調べる為に grep -l '#!/bin/sh' *.sh と実行すると期待通りに表示されました。 しかし、 grep -l '#!/bin/sh' * と実行したのですが次のプロンプトも表示されず止まってしまいました。 しかし、AIX5.2 bashでは grep -l '#!/bin/sh' * を実行すると正しく表示されました。 以下整理いたしました。 FedoraCore4 × grep -l '#!/bin/sh' * ○ grep -l '#!/bin/sh' *.sh AIX5.2 ○ grep -l '#!/bin/sh' * ○ grep -l '#!/bin/sh' *.sh 何故、動作の違いがあるのか教えて頂けないでしょうか。 よろしくお願い致します。

  • sed 1行スクリプト

    以下は、"PATTERN" にマッチする行の直前の行に、文字列"STRING"を挿入する sed スクリプトで、sed -f で期待どおりの動作をします。 ---------- /PATTERN/ i\ STRING ---------- ここで、PATTERN及びSTRINGは空白文字を含みます。 これを、sed の -e オプションを使って、1行コマンドで実行したいのですが、どうにもこうにもうまくいきません。 sedの基本が身についていないだけなのですが、お知恵を拝借できないでしょうか? 実行環境は次のとおりです。 GNU bash, version 2.04.0(1)-release (i686-pc-msys)

  • UNIX形式のテキストファイルをDOS形式に変換する(cshで実行したい)

    UNIX形式のテキストファイルをDOS形式に変換するというbash以下のシェルをcshで書き換えたいのですが、どうすればよいでしょうか #!/bin/bash # u2d.bash set infname = "$1" set outfnname = "$2" cat "${infname}" | sed "s/$/`echo -ne '\015'`\" | iconv -f EUCJP -MS -t CP932 > "${outfname}" 出展:linuxWorld (株)IDGジャパン発行 1月号 P53

  • 【sed】変数に設定したコマンドの実行について

    お世話になります。 一度変数に文字列として格納したsedコマンドの実行についての質問です。 以下、「実装1」のように、「あるファイルの最終行を除外して別のファイルに書き込む」という処理を行おうとしています。 ログ出力などの関係で、実行するコマンドを一度変数に格納する必要があるのですが 一度変数に格納して実行すると「実装2」のようにエラーが出てしまいます。 変数に格納したsedコマンドを実行するにはどのようにすればいいでしょうか? なお、シェルはbashです。 実行例ではターミナルから直接実行していますが、実際にはシェルスクリプトにして実行します。 以上、どなたかご教示頂けないでしょうか。 ■実装1 [root@localhost tmp]# cat /tmp/data aaa bbb ccc [root@localhost tmp]# sed -e '$d' /tmp/data >/tmp/data2 [root@localhost tmp]# cat /tmp/data2 aaa bbb [root@localhost tmp]# ■実装2 [root@localhost tmp]# CMD='sed -e $d /tmp/data >/tmp/data2' [root@localhost tmp]# echo $CMD sed -e $d /tmp/data >/tmp/data2 [root@localhost tmp]# $CMD aaa bbb sed: >/tmp/data2を読み込めません: そのようなファイルやディレクトリはありません [root@localhost tmp]#

  • sedでの改行置換

    sedを用いた処理で質問があります。 出力結果の改行を置換して一列として表示しようとしているのですが、どうもうまくいきません。 (perlは敢えて使いません) 例えば、以下のようなファイルがあるとして、 $ cat hoge.txt hoge boo bar この出力結果を加工して、「hoge boo bar」のように、 改行をスペースに置換して一行として表示したい場合は、どのようにすれば良いでしょうか? ちなみに、以下のような使い方だと、うまくいきませんでした。 $ cat hoge.txt | sed 's/\ > / /g' $ cat hoge.txt | sed 's/\n/ /' ■実行環境 OS : RedHat EL 1 sedのバージョン : sed-4.0.7-3 宜しくお願い致します。

  • 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)の質問、疑問に回答していただけると嬉しいです。 よろしくお願いします。