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

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

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

Linux Mintは、使いやすいLinuxシステムの提供を目的としたLinuxディストリビューションです。UbuntuとDebianをベースにしており、Ubuntuのリポジトリを共有しています。

CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

sed

sedとは、POSIX環境のために作られたコマンドラインエディタです。sedは編集スクリプトの指示のもとに複数のファイルを編集し、標準出力にその結果を出力します。

Linux

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

Q&A

解決済

5回答

741閲覧

SED文が難解過ぎて読めません

hogehoge989

総合スコア11

Linux Mint

Linux Mintは、使いやすいLinuxシステムの提供を目的としたLinuxディストリビューションです。UbuntuとDebianをベースにしており、Ubuntuのリポジトリを共有しています。

CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

sed

sedとは、POSIX環境のために作られたコマンドラインエディタです。sedは編集スクリプトの指示のもとに複数のファイルを編集し、標準出力にその結果を出力します。

Linux

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

0グッド

0クリップ

投稿2019/11/19 23:52

zcat -f /var/log/access*|sed -rn 's/^::ffff:([0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}) .+submit2/([0-9]+) .+$/\2,\1/p'|sort|uniq|grep 123456

こちらのコマンドですが、、zcat -f /var/log/access*とgrep 123456はわかるのですが、、、

|sed -rn 's/^::ffff:([0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}) .+submit2/([0-9]+) .+$/\2,\1/p'|sort|uniq|

上記省いた、||でくくられた中がわからないです。。。
こちらに来ればSEDマスターがいると伺いました。

句ごとに教えていただけませんでしょうか。。
恐らくですが、、

|sed -rn 's/^::ffff:
([0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3})
.+submit2/
([0-9]+)
.+$/\2,\1/p'
|sort|uniq|

とそれぞれわかれているようにも見えます。。私には象形文字にしか見えないです。
どたなかご教授願います。。ちなみに最後にgrep 123456でこのようにしてあるのは、
.outとしてwiresharkで123456に関連しているものをSEDを使って全部抜き出しているみたいです。

123456 xxxxxxx
123456 xxxxxxx
123456 xxxxxxx

その為、上のxxxxxxのコンディションを指定していると思うのですが、、難解過ぎて読めないです。
どなたかご教授願います。

よろしくお願いいたします。

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

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

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

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

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

guest

回答5

0

ベストアンサー

sedsコマンド、^\:\:ffff\:([0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}) .+submit2/([0-9]+) .+$の部分にまず着目します。これを分解して頭から見ていくと、下表のようになります。

No指定(メタ)文字列意味する文字列
1^行頭から
2:":"
3:":"
4ffff"ffff"
5:":"
6([0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3})"nnn.nnn.nnn.nnn"形式のIPv4アドレス(※第1グループ
7.+1文字スペース、続いて任意の文字が1文字以上
8submit2"submit2"
9/"/"
10([0-9]+)"0"から"9"の文字が1文字以上(※第2グループ)
11.+$1文字スペース、続いて任意の文字が1文字以上続き、行末まで

で、第1グループであるIPv4アドレス、第2グループのNo(?っぽいもの)を抜き出します。それを\2,\1/p部分で"第2グループ,第1グループ"の並びにし、pにより出力。|sortsortコマンドにパイプで繋げてソートして出力。更に|uniquniqコマンドにパイプで繋げて、重複行を削除、です。

対象とする行データは、::ffff:192.168.1.11 DONTCARE submit2/5 DONTCARE<改行>のようなものでしょう。sedコマンドの部分だけを実行してみると以下のようになります。

bash

1$ cat data.txt 2::ffff:192.168.1.11 DONTCARE submit2/5 DONTCARE 3::ffff:192.168.1.15 DONTCARE submit2/2 DONTCARE 4::ffff:192.168.1.20 DONTCARE submit2/1 DONTCARE 5 6$ sed -rn 's/^\:\:ffff\:([0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}) .+submit2/([0-9]+) .+$/\2,\1/p' data.txt 75,192.168.1.11 82,192.168.1.15 91,192.168.1.20

尚、sedコマンド自体のオプション指定の-nrですが、少なくともGNUsedをお使いなのでしょう。-nsedsコマンド中のpオプションs/置換元/置換先/pと組み合わせることで置換した文字列のみを出力するようにしています。-rは拡張正規表現をスクリプト中に許すもので、本質問で言えばIPv4アドレス相当の文字列中[0-9]{1,3}のような範囲繰り返し回数指定を可能としています。-rが無いとエラーになります。

GNU sed 4.4 について、man sed でのオプション説明抜粋 -E, -r, --regexp-extended use extended regular expressions in the script (for portability use POSIX -E).

投稿2019/11/20 00:55

編集2019/11/25 13:02
dodox86

総合スコア9183

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

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

退会済みユーザー

退会済みユーザー

2019/11/20 01:36

わかりやすい、丁寧、すばらしい!
dodox86

2019/11/20 02:27

お褒めいただいて光栄です。どうもありがとうございます。
otn

2019/11/25 12:34

> 範囲指定を可能 繰り返し回数指定 でしょうか。
dodox86

2019/11/25 13:04

otnさん、ご指摘ありがとうございます。回答を修正させていただきました。
guest

0

正規表現というものを知らないのであれば、今後のためにも最低限の理解だけはしておいた方が良いと思います。

/^\:\:ffff\:([0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}) .+submit2/([0-9]+) .+$/

この正規表現は長いですが、複雑な機能は使ってないので、正規表現の基本を理解すれば、すぐに読めるようになります。

ややおかしな点もあるので、これを書いた人もおそらく初心者です。

投稿2019/11/20 05:19

otn

総合スコア84557

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

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

0

最初に、標準入力や標準出力や標準エラーの概念を確認しておきます。
一見難解なコマンドの羅列は、すべて、標準入力で受け取り、標準出力に送り出す、
それをパイプという仕組みで他のコマンドの標準出力を次のコマンドの標準入力に渡すようにできています。

パイプは「|」縦棒みたいな記号で示されるので、
まずはパイプでコマンドを分割します。

## わかりやすさのため、パイプの箇所で改行しちゃうね zcat -f /var/log/access* sed -rn 's/^\:\:ffff\:([0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}) .+submit2/([0-9]+) .+$/\2,\1/p' sort uniq grep 123456

sedに関しては
sed コマンド | コマンドの使い方(Linux) | hydroculのメモ
やsedコマンドのマニュアルを探して丁寧に読んでみてほしいのだけど、
sedの箇所について、-rnってオプションがあるけど、
-nはマッチした行だけ出力するもの、
-rは拡張正規表現を使うことの宣言と言うか指示。拡張正規表現でメタ文字のエスケープを意図したいってことだろう。

基本正規表現と拡張正規表現とで扱いが異なるのは以下の7文字のみである。

  • ? { } ( ) |

これらの文字の前にバックスラッシュでエスケープするかどうかで、正規表現での特殊な意味になるか、単にその文字そのものの意味になるかが、基本正規表現と拡張正規表現とで変わる。拡張正規表現という名前の割には機能が上がっているわけではない。

ってなことを踏まえつつ、
正規表現 & sed & awk - Qiitaでsコマンドの仕組みを理解しつつ
正規表現メモで細かな正規表現の差異も気にしつつ
解読がんばれ。
(時間的余裕が出たら、あとで解読頑張る。)

投稿2019/11/20 01:12

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

抜き出された部分は sed と sort と uniq と3つのコマンドが書かれてます。
sed の結果を sort し uniq して grep に渡す。

sedは単純な置き換えです。でも慣れないと正規表現が暗号でしょうね。

前半 /^(###)(&&&)$/ と 後半 /\2,\1/ があって
前半に一致したら、
(###) 部分と (&&&) 部分を \1に###を\2に&&&をいれます
ということです。
-rn とか最後の /p とかは勉強して下さい。
****部分もnagettyさんの資料で勉強できるかと

投稿2019/11/20 00:27

winterboum

総合スコア23347

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

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

0

sedは使えるようになると大変便利なツールなんで、これから先も付き合わないといけないようなら下記のURLで学習することをお勧めします。

https://www.aihara.co.jp/~taiji/unix-tips/a2asterisk/sed-howto-0.html

投稿2019/11/20 00:08

nagaetty

総合スコア1106

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問