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

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

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

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

CentOS

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

Linux

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

Q&A

解決済

2回答

940閲覧

特定の文字の出現回数と出現回数の間の値を取得したい

satsukichan

総合スコア52

bash

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

CentOS

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

Linux

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

1グッド

1クリップ

投稿2019/04/19 02:31

以下のようなログがあります。

47/0/0/178/225 200 917 - - --VN 24/24/0/0/0 0/0 "POST /xxxxxxx HTTP/1.1" 12672/0/0/281/12953 302 1577 - - --VN 24/24/2/2/0 0/0 "POST /xxxxxxx HTTP/1.1" 2402/0/0/328/2730 302 1587 - - --VN 24/24/2/2/0 0/0 "POST /xxxxxxx HTTP/1.1" 3/0/0/176/180 200 6752 - - --NI 26/26/3/3/0 0/0 "GET /xxxxxxx HTTP/1.1" 3/0/0/321/325 200 59203 - - --VN 26/26/2/2/0 0/0 "GET /xxxxxxx HTTP/1.1" 3/0/0/346/351 200 53647 - - --VN 26/26/1/1/0 0/0 "GET /xxxxx HTTP/1.1" 13150/0/0/291/13443 200 53097 - - --VN 25/25/1/2/0 0/0 "POST /xxxxxxx HTTP/1.1"

やりたいこととしては
「3回目の/と4回目の/の間の数字を取得したい」
ということになります。先頭にスペースが入っていたり、その前の文字数が違うでcutなどによる加工が難しいです。

一番上の行だと178、次の行だと281という値を取得したいです。

※最終的にはこの値が1000以上だとメールを飛ばすというシェルスクリプトを作成しようと考えています。

恐らく実現可能かと思うのですが知識不足の為質問させて頂きました。
宜しくお願い致します。

DrqYuto👍を押しています

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

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

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

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

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

guest

回答2

0

ベストアンサー

cutやawkで区切り文字を/にして、4列目の値を取り出せば達成できそうです。

bash

1cut -d/ -f4 2awk -F/ '{ print $4 }'

投稿2019/04/19 02:57

dice142

総合スコア5158

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

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

satsukichan

2019/04/19 03:07

出来ました!ありがとうございますm(_ _)m
guest

0

「3回目の/と4回目の/の間の数字を取得したい」

AWKでスクリプトファイルを素直に書いてみました

AWK

1{ 2 aindex($0, "/", ar); 3 i = ar[3] + 1; 4 l = ar[4] - ar[3] - 1; 5 print substr($0, i, l); 6} 7 8# aindex();index()拡張 9# str :文字列 10# find :検索文字列 11# apos :配列(全発見位置) 12# 戻り値 :発見した個数 13function aindex(str, find, apos, pos, tpos, freq) { 14 freq = 0; 15 delete apos; 16 do { 17 if (pos = index(str, find)) { 18 tpos += pos; 19 apos[++freq] = tpos; 20 str = substr(str, pos + 1); 21 } 22 } while (pos) 23 return freq; 24}

result
178
281
328
176
321
346
291

もしかしたら、総当たりな方が速いかもしれないです

AWK

1function indexG(str, find, apos, flen, i, subs, freq) { 2 freq = 0; 3 delete apos; 4 flen = length(find); 5 while (subs = substr(str, ++i, flen)) 6 if (subs == find) apos[++freq] = i; 7 return freq; 8}

投稿2019/12/04 16:36

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問