ApacheログファイルでAPI応答時間を見つける必要があります。応答時間と同様に1~2秒、2~3秒程度かかります。$6
は応答時間で、値はマイクロ秒単位です。
次のコマンドを使用しようとしていますが、出力は常に同じです。
grep 17/Sep/2016:10 /access.log| awk '{print ($6 > 1000000 && 2000000 > $6)}' | wc -l
答え1
この質問は、例としていくつかの行を追加するとaccess.log
より明確になります。とにかく、awkコマンドは値に関係なく1行を印刷するので、$6
行数を数えるとwc -l
grepによってのみ決定される結果が得られます。
$6
2つの異なる値間の行数を計算するには、次のように書くことができます。
grep 17/Sep/2016:10 /access.log | awk '$6 > 1000000 && 2000000 > $6' | wc -l
ただし、このパイプラインはやや非効率的です。次のように、単一のawkコマンドを組み合わせるのがほぼ常に優れています。
awk '/17\/Sep\/2016:10/ && $6 > 1000000 && 2000000 > $6 {c++} END{print c}' access.log
境界を含めるには、次のようにします。
grep 18/Sep/2016:11 /access.log | awk ' $6>=1000000 && $6<=2000000' | wc -l
または等しく
awk '/18\/Sep\/2016:11/ && $6>=1000000 && $6<=2000000 {c++} END{print c}' access.log
答え2
使用幸せ(以前のPerl_6)
条件付き文字列は、最初の列で一致する行のみを返します(必須ではありませんgrep
)。この.words
ルーチンは空白に分割されます。一致する行をne
省略する代わりに使用eq
:
~$ raku -ne '.put if .words[0] eq "Mar";' file
Mar 2nd 3rd 4th 5th 1000002 7th
数値不等式を連結して、6番目の列に希望の値を持つ行を返します。
~$ raku -ne '.put if 1000000 <= .words[5] < 3000000;' file
Feb 2nd 3rd 4th 5th 1000001 7th
Mar 2nd 3rd 4th 5th 1000002 7th
Apr 2nd 3rd 4th 5th 1000003 7th
May 2nd 3rd 4th 5th 2000001 7th
Jun 2nd 3rd 4th 5th 2000002 7th
条件文を一緒に使用してください。
~$ raku -ne '.put if .words[0] ne "Mar" && 1000000 <= .words[5] < 3000000;' file
Feb 2nd 3rd 4th 5th 1000001 7th
Apr 2nd 3rd 4th 5th 1000003 7th
May 2nd 3rd 4th 5th 2000001 7th
Jun 2nd 3rd 4th 5th 2000002 7th
行カウンタを最終出力として使用します。
~$ raku -ne 'BEGIN my $line_cnt; ++$line_cnt if .words[0] ne "Mar" && 1000000 <= .words[5] < 3000000; END put $line_cnt;' file
4
入力例:
Jan 2nd 3rd 4th 5th 999999 7th
Feb 2nd 3rd 4th 5th 1000001 7th
Mar 2nd 3rd 4th 5th 1000002 7th
Apr 2nd 3rd 4th 5th 1000003 7th
May 2nd 3rd 4th 5th 2000001 7th
Jun 2nd 3rd 4th 5th 2000002 7th
Jul 2nd 3rd 4th 5th 3000001 7th
https://docs.raku.org/言語/operators#Tight_AND_precedence
https://docs.raku.org/言語/phasers
https://raku.org
答え3
使用真珠
条件付き文字列は、最初の列の一致する行のみを返します(必須ではありませんgrep
)。一致する行をne
省略する代わりに使用eq
:
~$ perl -lane 'print if $F[0] eq "Mar";' file
Mar 2nd 3rd 4th 5th 1000002 7th
6番目の列で、目的の値を持つ行の数値不等式を返します。
~$ perl -lane 'print if $F[5] >= 1000000 && $F[5] < 3000000;' file
Feb 2nd 3rd 4th 5th 1000001 7th
Mar 2nd 3rd 4th 5th 1000002 7th
Apr 2nd 3rd 4th 5th 1000003 7th
May 2nd 3rd 4th 5th 2000001 7th
Jun 2nd 3rd 4th 5th 2000002 7th
条件文を一緒に使用してください。
~$ perl -lane 'if (($F[0] ne "Mar") && ($F[5] >= 1000000) && ($F[5] < 3000000)) {print $_};' file
Feb 2nd 3rd 4th 5th 1000001 7th
Apr 2nd 3rd 4th 5th 1000003 7th
May 2nd 3rd 4th 5th 2000001 7th
Jun 2nd 3rd 4th 5th 2000002 7th
行カウンタを最終出力として使用します。
~$ perl -lane 'BEGIN {$line_cnt}; if (($F[0] ne "Mar") && ($F[5] >= 1000000) && ($F[5] < 3000000)) {++$line_cnt}; END {print $line_cnt};' file
4
入力例:
Jan 2nd 3rd 4th 5th 999999 7th
Feb 2nd 3rd 4th 5th 1000001 7th
Mar 2nd 3rd 4th 5th 1000002 7th
Apr 2nd 3rd 4th 5th 1000003 7th
May 2nd 3rd 4th 5th 2000001 7th
Jun 2nd 3rd 4th 5th 2000002 7th
Jul 2nd 3rd 4th 5th 3000001 7th
https://en.wikibooks.org/wiki/Perl_Programming/Conditionals
https://stackoverflow.com/questions/16678272/perl-script-to-count-words-lines
https://unix.stackexchange.com/a/727962/227738