質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

コマンドライン

コマンドライン(別名:Command Line Interface)は、ユーザに命令の入力を促す(プロンプト)文字列の表示を行い、すべての操作をキーボードを用いて文字列を打ち込む事でプログラムを走らせるユーザインターフェースです。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

AWK

AWKは、UNIX 上で開発されたプログラミング言語で、CSVファイルなどのテキストファイルの処理を目的にデザインされています。

Q&A

2回答

1478閲覧

複雑なLinuxコマンド出力結果を必要な行だけを取り出し加工したい

minhouse10

総合スコア41

bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

コマンドライン

コマンドライン(別名:Command Line Interface)は、ユーザに命令の入力を促す(プロンプト)文字列の表示を行い、すべての操作をキーボードを用いて文字列を打ち込む事でプログラムを走らせるユーザインターフェースです。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

AWK

AWKは、UNIX 上で開発されたプログラミング言語で、CSVファイルなどのテキストファイルの処理を目的にデザインされています。

0グッド

0クリップ

投稿2021/06/07 15:10

netstat -svコマンドの実行結果から、各”XXX:”にセクションに毎に特定の行のみを抜き出し半角スペースを区切りで一行で繋ぎたいと思っております。
ただセクションが複数ありtabによるインデントがされている構造になっており、”XXX:”にセクションによって抜き出したい箇所が違うのでいい方法が見つからないでいます。以下の様にawkコマンドをパイプでつないでやり方を模索しているのですが、アドバイス頂けますと幸いです。

以下のコマンドだと最初の要件は満たせますが、Ip:と数字の間に余計なスペースが入ってしまう、他の行の抜き出すための応用ができていないとうの壁にぶつかっています。

netstat -sv |awk 'BEGIN{RS="";FS="\n"}{print $1 $8}'
Ip: 19942241 total packets received

抜き出したい行は以下の通りです。
Ip:セクションの一行目と8行目を抜き出し一行に表示
Ip: 19942241 total packets received 3 dropped because of missing route

Icmp:セクション、Icmp input histogram:サブセクションのdestination unreachable:を一行に表示
ICMP input histogram: destination unreachable: 5

Icmp:セクション、Icmp output histogram:サブセクションのdestination unreachable:を一行に表示
ICMP output histogram: destination unreachable: 8

実際のコマンド実行結果:
実際のコマンド実行結果

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

タブ区切りじゃなくて、空白4つ区切りじゃないですかね。
第一段見出し、第二段見出しをそれぞれ保存して、該当データを表示します。

sh

1awk 'BEGIN{FS=" "} 2$1~/:$/{ 3 H1=$1;H2="";N1=NR;next} 4$1=="" && $2~/:$/{ 5 H2=$2;next} 6H1=="Ip:" && (NR-N1)==8 { 7 print H1 " " $2;next} 8H1=="Icmp:" && H2=="ICMP input histogram:" && /destination unreachable:/{ 9 print H2 $3;next} 10H1=="Icmp:" && H2=="ICMP output histogram:" && /destination unreachable:/{ 11 print H2 $3;next} 12'

おそらく、これくらいで十分です。

sh

1awk 'BEGIN{FS=" "} 2$1~/:$/{ 3 H1=$1;H2="";N1=NR;next} 4$2~/:$/{ 5 H2=$2;next} 6H1=="Ip:" && (NR-N1)==8 { 7 print H1 " " $2} 8H2~/ICMP .* histogram:/ && /unreachable:/{ 9 print H2 $3} 10'

投稿2021/06/08 01:49

otn

総合スコア84555

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

minhouse10

2021/06/08 05:03

otn様、素晴らしいアドバイスとコードご教授頂きありがとうございます!、実際にコードを実行して見ました所、以下のようなエラーが発生してしまいました。もう少し自分でも構文をチェックして行きたいと思います。また一行ずつ意味を確かめつつテストし結果またご報告させて頂きます。 awk: test2.awk:1: awk 'BEGIN{FS=" "} awk: test2.awk:1: ^ invalid char ''' in expression
otn

2021/06/08 09:14

sh で実行せずに awk で実行したとかでしょうか。
minhouse10

2021/06/08 11:10

otn様、申し訳ございません、仰る通りawkで実行しておりました!
guest

0

考え方としては、

  • セクションの区切りの行、Ipセクション内の行、Icmpセクション内の行で場合分けして処理。
  • 今どのセクションを処理中なのかの情報を保持する状態変数を設定。

ざっくりこんな感じでどうでしょう。

# test.awk {sub(" *", "")} $1~/:$/{ sect = $1 if(out != ""){ print out out = "" } subsect = "" } sect=="Ip:"{ if(/total packets received/) out = $0 if(/dropped because of missing route/) out = out " " $0 "\n" } sect=="Icmp:"{ if(/:$/) subsect = $0 if(/destination unreachable:/) out = out subsect " " $0 "\n" }
$ netstat -sv | awk -f test.awk

投稿2021/06/07 16:27

KojiDoi

総合スコア13671

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

minhouse10

2021/06/08 04:58

KojiDoi様、素晴らしいアドバイスとコードをご提供頂きまして本当にありがとうございます!ご教授頂きましたコードについて一行ずつ意味を確かめながらテストして行きたいと思います。また結果ご報告させて頂きます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問