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

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

新規登録して質問してみよう
ただいま回答率
85.48%
シェルスクリプト

シェルスクリプトは、UNIX系のOSもしくはコマンドラインインタプリタ向けに記述されたスクリプト。bash/zshといったシェルによって実行されるため、このように呼ばれています。バッチ処理などに使用されており、テキストファイルに書かれた命令を順に実行します。

シェル

シェル(shell)はUnix や Linux 系のOSで使用されるコマンドインタプリタを指します。

Q&A

解決済

3回答

987閲覧

シェルスクリプト内で、別ファイルを参照する。

ysysys

総合スコア16

シェルスクリプト

シェルスクリプトは、UNIX系のOSもしくはコマンドラインインタプリタ向けに記述されたスクリプト。bash/zshといったシェルによって実行されるため、このように呼ばれています。バッチ処理などに使用されており、テキストファイルに書かれた命令を順に実行します。

シェル

シェル(shell)はUnix や Linux 系のOSで使用されるコマンドインタプリタを指します。

0グッド

0クリップ

投稿2017/12/19 05:58

シェルの中で別ファイルの情報を参照したいと考えております。

例えば、以下の test.sh があったとして、IPアドレスが記述されている部分を
ip.txt内のIPアドレスを参照する。といった感じにしたいです。


cat test.sh

#!/bin/bash

cat /var/log/httpd/access_log |
awk -F '"' '{if (tolower($6) !/spider/ &&
tolower($6) !
/googlebot/ &&
tolower($6) !~ /hackney/) print $0}' |
awk -F '"' '{if ($2 ~ /GET/) print $0}'|
awk '{if($1 !~ /100.100.100.100/ &&
$1 !~ /100.100.100.101/ &&
$1 !~ /100.100.100.102/ &&
$1 !~ /100.100.100.103/ &&
$1 !~ /100.100.100.104/) print $0}' |
awk '{print $7}' | sort | uniq -c | sort -r | head > /var/tmp/hoge.log


cat ip.txt

100.100.100.100
100.100.100.101
100.100.100.102
100.100.100.103
100.100.100.104


記述について教えていただけないでしょうか。
よろしくお願い致します。

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

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

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

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

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

guest

回答3

0

ベストアンサー

直したいところは色々ありますが、それはさておき、awkで別ファイルを参照するという話ですね。

Bash

1前略 2awk '!F{IP[$0]=1;next} # ファイルip.txtを読んだときの処理 3{if(!($1 in IP)) {print $0}} # そうでない、つまり標準入力を読んだ時の処理 4' ip.txt F=1 - | 5後略

正規表現でなくin演算子で、文字列の一致で判断してます。
#コメントを受けての追記

Bash

1前略 2awk '!F{IP[$0]=1;next} # ip.txtの正規表現を保存 3{for(i in IP) if($1 ~ i) next} # 保存した正規表現にマッチすれば飛ばす 4{print $0} # 飛ばされなかった物を表示 5' ip.txt F=1 - | 6後略

投稿2017/12/19 16:15

編集2017/12/20 05:54
otn

総合スコア84499

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

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

ysysys

2017/12/20 00:06

otnさんありがとうございます! 立て続けの質問で恐縮ですが、正規表現をip.txtに書き入れたときはスクリプトの内容はどう変更すればよろしいでしょうか。。? # cat ip.txt 100.100.100.100 100.100.100.101 100.100.100.102 100.100.100.103 100.100.100.104 ↓ # cat ip.txt 100.100.100.*
ysysys

2017/12/25 05:22

otnさんありがとうございます。 本当に助かりました。
guest

0

データテーブルのあるファイルを読み、その後標準入力を処理するということですね。

データ生成 | awk ’スクリプト’ データファイル名1 データファイル名2・・・  -

とします。スクリプト部分は

FILENAME!="-"{ データテーブルの行を配列などに入れる処理  next } 入力データを処理するスクリプト ```と書けば良いです。

投稿2017/12/21 03:06

a_saitoh

総合スコア702

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

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

ysysys

2017/12/22 00:27

ご丁寧にありがとうございます。 実践してみます。
guest

0

こんな漢字で

bash

1$ cat test.sh 2#!/bin/bash 3dir=`dirname $0` 4patterns=${dir}/ip.txt 5 6cat /var/log/httpd/access_log| 7awk -F '"' '{ 8 if (tolower($6) !~/spider/ && 9 tolower($6) !~/googlebot/ && 10 tolower($6) !~ /hackney/) print $0 11}'| 12awk -F '"' '{ 13 if ($2 ~ /GET/) print $0 14}'| 15grep -E -f ${patterns} -v| 16awk '{print $7}'|sort|uniq -c|sort -r|head > /var/tmp/hoge.log

改行とインデントを追加していますが、grep以外は元のままです。

bash

1$ cat ip.txt 2^100.100.100.[0-9]+

投稿2017/12/20 03:41

編集2017/12/20 03:43
hichon

総合スコア5737

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

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

ysysys

2017/12/22 00:28

ありがとうございます。 こちらの方法を真似て実践してみます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問