次の形式のファイルがあります。
トレースプロセスの開始17 134 17 136 17 137 17 138(/ usr / sbin / nginx)... [1465461983910514] pid:17136 get/ 合計:244us、accept()〜ヘッダー読み取り:19us、書き換え:9us、事前アクセス:13us、アクセス:9us、コンテンツ:137us アップストリーム:接続=0us、最初のバイトまでの時間=0us、読み取り=0us [1465461983911223] pid:17136 GET /sfi9876 合計:110us、accept()〜ヘッダー読み取り:12us、書き換え:13us、事前アクセス:20us、アクセス:13us、コンテンツ:137us アップストリーム:接続=0us、最初のバイトまでの時間=0us、読み取り=0us [1465461983911949] pid:17136 GET /lpt9 合計:127us、accept()〜ヘッダー読み取り:14us、書き換え:18us、事前アクセス:28us、アクセス:20us、コンテンツ:137us アップストリーム:接続=0us、最初のバイトまでの時間=0us、読み取り=0us [1465461983912121] pid:17136 GET /~sfi9876 合計:127us、accept()〜ヘッダー読み取り:11us、書き換え:24us、事前アクセス:37us、アクセス:26us、コンテンツ:137us アップストリーム:接続=0us、最初のバイトまでの時間=0us、読み取り=0us
各要求に費やされた合計時間を使用して、このログを次のようにソートしたいと思います。
トレースプロセスの開始17 134 17 136 17 137 17 138(/ usr / sbin / nginx)... [1465461983911223] pid:17136 GET /sfi9876 合計:110us、accept()〜ヘッダー読み取り:12us、書き換え:13us、事前アクセス:20us、アクセス:13us、コンテンツ:137us アップストリーム:接続=0us、最初のバイトまでの時間=0us、読み取り=0us [1465461983911949] pid:17136 GET /lpt9 合計:127us、accept()〜ヘッダー読み取り:14us、書き換え:18us、事前アクセス:28us、アクセス:20us、コンテンツ:137us アップストリーム:接続=0us、最初のバイトまでの時間=0us、読み取り=0us [1465461983912121] pid:17136 GET /~sfi9876 合計:127us、accept()〜ヘッダー読み取り:11us、書き換え:24us、事前アクセス:37us、アクセス:26us、コンテンツ:137us アップストリーム:接続=0us、最初のバイトまでの時間=0us、読み取り=0us [1465461983910514] pid:17136 get/ 合計:244us、accept()〜ヘッダー読み取り:19us、書き換え:9us、事前アクセス:13us、アクセス:9us、コンテンツ:137us アップストリーム:接続=0us、最初のバイトまでの時間=0us、読み取り=0us
したがって、bashスクリプトを使用してこれを行う方法を提案してください。
答え1
通常のwhile read
ループを使用してから、read
ループ内で2回使用して、各グループの2行目と3行目を読み取ることができます。
while read -r line1; do
read -r line2
read -r line3
...
done
答え2
headTime=$(echo $line|cut -d':' -f2|cut -du)
EOFまで繰り返し、各項目(3行)を読み、時間を抽出しますtotal=$(expr $headTime + $rewriteTime + ...)
。
その後、3行の各セットを合計で始まる単一行として出力し(並べ替え用)、行区切り記号(たとえば)を入れて、ソート|
後に簡単に区切ることができます。次に、明らかに一時ファイルを並べ替えて行を再分割しますsort -n tempFile|sed "s/|/\n/g"
。