ログファイルは次のとおりです。 -
Source=Mobile
IP=189.23.45.01
STATUS=SUCCESS
TIME=10 sec
Source=Desktop
IP=189.23.34.23
STATUS=FAIL
TIME=101 sec
Source=Mobile
IP=189.23.34.23
STATUS=FAIL
TIME=29 sec
ファイルはこのように続きます。
質問:
- FAILステータスのIPをお探しですか?
- ステータスが「成功」であるすべてのリクエストを見つけるのにかかる平均時間は何ですか?
- モバイルデバイス経由のログイン数と所要時間をリストします。
答え1
3つの質問をしました。最初の質問から始めましょう。同じ基本構造を使用して他の2つの質問を直接解決する必要があります(このサイトには、平均化などの数値処理にAwkを使用する多くの例があります)。
awkを使う短絡モード(レコード区切り記号の設定を解除する)と(改行)を使用してRS
レコードをフィールドに分割します。=
\n
$ awk -vRS= -F'[=\n]' '/STATUS=FAIL/{print $4}' file.log
189.23.34.23
189.23.34.23
答え2
トリムされていないバージョンでは、データが次に含まれていると仮定すると、Bashスクリプトは次のように見えますdatafile
。
#!/bin/bash
printf "IPs where status is fail:\n"
grep -z -oP 'IP=\K.*\n(?=STATUS=FAIL)' datafile
printf "Avg time taken by all requests where status is 'success':\n"
grep -z -oP 'STATUS=SUCCESS\nTIME=\K\d+' datafile | \
awk '{ total += $1; count++ } END { print ( count == 0 ? "NaN" : total/count); }'
printf "Number of logins (successful and failed) via Mobile:\n"
grep -c 'Source=Mobile' datafile
簡単な説明:
- Q2)平均時間計算:この
grep
コマンドは時間値を抽出します(すべて秒単位であると仮定)。値をawk
コマンドにパイプして平均を計算し、その平均を印刷します。
答え3
read -p "Lets Give File Name , placed in the same dir: " file ;
echo " Ques : Find the Number of IP which failed "
echo "Ans: "
cat "${file}".txt | grep -i STATUS=FAIL -B1 | grep -i IP | awk -F '=' '{print $NF}'
#cat "${file}".txt | grep -i STATUS=SUCCESS -A1 | grep -i Time | awk -F '=' '{print $NF}' &> clear2.txt
echo "Ques : Find the avg of success time"
echo "Ans : "
cat "${file}".txt | grep -i STATUS=SUCCESS -A1 | grep -i Time | awk -F '=' '{print $2}' | awk '{print $1}' &> clear2.txt
avgtime=0
i=0
for x in `cat clear2.txt`
do
i=$(($i + 1))
avgtime=$(($avgtime +$x))
echo "avg time after ${i} iteration is :${avgtime}"
y=$(($x))
done
#echo "${x}"
#echo "${y}"
avgtime=$(($avgtime/$i))
echo "THe avg time is : ${avgtime}"
echo "Ques : What is the Number of time mobile was tried to login"
echo "Ans :"
cat testfile.txt | grep -i Mobile | wc -l