参考:
https://www.cnblogs.com/Formulate0303/p/11170824.html
http://www.nndssk.com/xtwt/202057pvaGrC.html
系统命令:wc -l filename #统计大文件实在是太慢了
grep方法:grep -c "" filename #表示找出文本文件中所有的行,并输出行数。-c选项用于数目计数,可以统计文本文件中每行符合指定模式的行数,并输出总和。
grep -n "" | awk -F : 'END{print $1}' #迅速。解压打开文件,文件每行前标出行号并用冒号连接,以冒号为分隔符输出最后一行的第一列
sed方法:sed -n '$=' filename #迅速。直接打印出多少行。-n 取消默认的输出,使用安静(silent)模式。'$='输出最后一行行号,'='输出行号
awk方法:awk 'END{print NR}' filename #迅速。解压打开文件,输出文件最后一行行号
测试文件
生成测试所需文件:
# awk 'BEGIN{for(i=0;i<10000000;i++)print i}' >> test.txt
# ll -h test.txt
-rw-r----- 1 root root 79M May 5 15:58 test.txt
| 命令 | 第一次测试时长 | 第二次测试时长 | 第三次测试时长 | 平均时长 | 备注 |
|---|---|---|---|---|---|
| time wc -l test.txt | 0.101 | 0.118 | 0.100 | 0.107 | |
| time grep -c "" test.txt | 0.352 | 0.397 | 0.375 | 0.375 | |
| time sed -n '$=' test.txt | 0.731 | 0.700 | 0.711 | 0.714 | |
| time awk 'END{print NR}' test.txt | 0.476 | 0.464 | 0.454 | 0.465 |
测试压缩文件
| 命令 | 第一次测试时长 | 第二次测试时长 | 第三次测试时长 | 平均时长 | 备注 |
|---|---|---|---|---|---|
| time zcat test.gz | grep -v "^#" | wc -l | 0.728/0.990 | 0.717/1.040 | 0.704/0.961 | ||
| time zcat test.gz | grep -v "^#" | grep -c "" | 0.723/1.008 | 0.720/1.205 | 0.716/1.068 | ||
| time zcat test.gz | grep -v "^#" | sed -n '$=' | 0.722/1.131 | 0.705/1.224 | 0.708/1.207 | ||
| time zcat test.gz | grep -v "^#" | awk 'END{print NR}' | 0.780/1.124 | 0.713/1.309 | 0.720/1.128 |
测试压缩文件+过滤关键词
| 命令 | 第一次测试时长 | 第二次测试时长 | 第三次测试时长 | 平均时长 | 备注 |
|---|---|---|---|---|---|
| time zcat test.gz | awk -F'\\|\\|' '$11=="-"{print $11}' | wc -l | 2.812/4.650 | 2.807/4.616 | 2.829/4.602 | ||
| time zcat test.gz | awk -F'|' '$21=="-"{print $21}' | wc -l | 4.090/5.900 | 4.356/5.538 | 4.083/5.899 | ||
| time zcat test.gz | awk -F'\\|\\|' '$11=="-"{print $11}' | grep -c "" | 3.051/4.691 | 3.208/4.588 | 3.242/4.760 | ||
| time zcat test.gz | awk -F'|' '$21=="-"{print $21}' | grep -c "" | 4.081/5.974 | 4.082/5.881 | 4.091/5.885 | ||
| time zcat test.gz | grep -c "||-||[a-z].*$" | 0.717/1.438 | 0.798/1.550 | 0.780/1.455 | ||
| time zcat test.gz | egrep -c "\|\|-\|\|[a-z].*$" | 0.829/1.422 | 0.795/1.329 | 0.786/1.338 | ||
| time zcat test.gz | grep "||-||[a-z].*$" | sed -n '$=' | 0.762/1.512 | 0.768/1.481 | 0.809/1.523 | ||
| time zcat test.gz | grep "||-||[a-z].*$" | awk 'END{print NR}' | 0.731/1.439 | 0.726/1.418 | 0.829/1.574 | ||
| time zcat test.gz | egrep "\|\|-\|\|[a-z].*$" | awk 'END{print NR}' | 0.829/1.408 | 0.732/1.289 | 0.713/1.289 | ||
| time zcat test.gz | awk '/\|\|-\|\|[a-z].*$/ {count++} END {print count}' | 5.886/7.372 | 5.449/7.174 | 5.699/7.251 |
测试压缩文件+过滤关键词+占比
| 命令 | 第一次测试时长 | 第二次测试时长 | 第三次测试时长 | 平均时长 | 备注 |
|---|---|---|---|---|---|
| time zcat test.gz |awk -F '|' '{count[$21]++} END {for (i in count) printf "%s\t%d\t%.2f%%\n", i, count[i], count[i]/NR*100}' |grep - |more | 4.396/5.521 | 4.350/5.854 | 4.400/5.928 | ||
| time zcat test.gz |awk -F '\\|\\|' '{count[$11]++} END { printf "%d\t%d\t%.2f%%\n", count["-"], NR, count["-"]/NR*100}' | 3.105/4.496 | 3.732/4.841 | 3.596/4.503 | ||
| time zcat test.gz | awk -F'|' 'BEGIN {ms1=0}{if($21=="-") ms1++;}END{printf ("%d\t%d\t%.2f%%\n",ms1,NR,ms1/NR*100)}' | 4.597/5.486 | 4.449/5.624 | 4.370/5.686 | ||
| time zcat test.gz | awk -F '\\|\\|' 'BEGIN {ms1=0}{if($11=="-") ms1++; }END{printf ("%d\t%d\t%.2f%%\n",ms1,NR,ms1/NR*100)}' | 2.829/4.266 | 2.799/3.579 | 2.816/3.742 |
注:if方式取决于匹配到的数据量为准,如果数据量较大,处理时长会相对长点。
测试多个压缩文件+过滤关键词+占比
| 命令 | 第一次测试时长 | 第二次测试时长 | 第三次测试时长 | 平均时长 | 备注 |
|---|---|---|---|---|---|
| time zcat test*.gz | awk -F '|' '{count[$21]++} END { printf "%d\t%d\t%.2f%%\n", count["-"], NR ,count["-"]/NR*100}' | 5m3.144s/6m26.011s | 4m57.363s/6m22.892s | 5m0.741s/6m19.008s | ||
| time zcat test*.gz |awk -F '\\|\\|' '{count[$11]++} END { printf "%d\t%d\t%.2f%%\n", count["-"], NR, count["-"]/NR*100}' | 3m47.792s/5m12.351s | 3m49.307s/5m15.080s | 3m52.446s/5m17.074s | ||
| time zcat test*.gz | awk -F'|' 'BEGIN {ms1=0}{if($21=="-") ms1++; }END{printf ("%d\t%d\t%.2f%%\n",ms1,NR,ms1/NR*100)}' | |||||
| time zcat test*.gz | awk -F'\\|\\|' 'BEGIN {ms1=0}{if($11=="-") ms1++; }END{printf ("%d\t%d\t%.2f%%\n",ms1,NR,ms1/NR*100)}' | 3m23.639s/4m49.363s | 3m27.101s/4m46.178s | 3m19.127s/4m50.116s |
批量测试多个压缩文件+过滤关键词+占比
# cat scan.sh
#!/bin/bash
logdir="/root/test_route"
zxdir="/root"
gzfile="${zxdir}/route_inquire_log"
inquire_date="2023-05-05-11-20-5"
ls ${logdir}/${inquire_date}*_appa_route_appa_*.gz > ${gzfile}
function check(){
tmp_fifofile="/tmp/$$.fifo" #以进程ID号命名管道文件
mkfifo $tmp_fifofile #创建临时管道文件
exec 6<>$tmp_fifofile #以读写方式打开tmp_fifo_file管道文件,文件描述符为6,也可以取3-9任意描述符
rm $tmp_fifofile #删除临时管道文件,也可不删除
for ((i=0;i<$thead_num;i++));do
echo
done >&6 #输出重导向到定义的文件描述符4上
for gz_file in `cat ${gzfile}`;do
read -u6
{
ret=`zcat ${gz_file} | awk -F '\\\\|\\\\|' 'BEGIN {ms1=0}{if($11=="-") ms1++; }END{printf ("%d\t%d\t%.2f\n",ms1,NR,ms1/NR*100)}'`
echo -e "${gz_file}\t${ret}" |tee -a $LOG
sleep 1
echo >&6 #再写入一个空行,使挂起的循环继续执行
} & #放入后台执行
done
wait #等待所有后台进程执行完成
exec 6>&- #删除文件描述符
}
LOG="ret.txt"
>$LOG
thead_num=5
check
分开执行结果:
# time sh scan.sh
/root/test_route/2023-05-05-11-20-57__test__1004.gz 10822 410543 2.64
/root/test_route/2023-05-05-11-20-57__test__1001.gz 38736 1468845 2.64
/root/test_route/2023-05-05-11-20-57__test__1002.gz 38836 1472938 2.64
/root/test_route/2023-05-05-11-20-57__test__1003.gz 38894 1474999 2.64
/root/test_route/2023-05-05-11-20-57__test__1000.gz 38831 1472882 2.64
/root/test_route/2023-05-05-11-20-57__test__1005.gz 25356 1101200 2.30
/root/test_route/2023-05-05-11-20-57__test__2001.gz 0 66280 0.00
/root/test_route/2023-05-05-11-20-57__test__2000.gz 0 188654 0.00
/root/test_route/2023-05-05-11-20-57__test__1000.gz 8636 127493 6.77
/root/test_route/2023-05-05-11-20-57__test__3001.gz 8851 977688 0.91
/root/test_route/2023-05-05-11-20-57__test__1001.gz 960 29085 3.30
/root/test_route/2023-05-05-11-20-57__test__2000.gz 0 3036 0.00
/root/test_route/2023-05-05-11-20-57__test__3000.gz 11659 1492287 0.78
/root/test_route/2023-05-05-11-20-57__test__4001.gz 8851 976172 0.91
/root/test_route/2023-05-05-11-20-57__test__2001.gz 0 1285 0.00
/root/test_route/2023-05-05-11-20-57__test__4000.gz 11659 1491284 0.78
/root/test_route/2023-05-05-11-20-57__test__3001.gz 8399 979872 0.86
/root/test_route/2023-05-05-11-20-57__test__4001.gz 8399 978450 0.86
/root/test_route/2023-05-05-11-20-57__test__3000.gz 10647 1497706 0.71
/root/test_route/2023-05-05-11-20-57__test__4000.gz 10647 1497228 0.71
real 0m14.017s
user 1m4.579s
sys 0m1.833s
# time cat ret.txt | awk -F'\t' '{sum1+=$2; sum2+=$3; }END{printf ("%d,%d,%.2f%%\n", sum1,sum2,sum1/sum2*100)}'
280183,17707927,1.58%
real 0m0.002s
user 0m0.002s
sys 0m0.000s
合并执行结果:
# time sh scan.sh | awk -F'\t' '{sum1+=$2; sum2+=$3; }END{printf ("%d,%d,%.2f%%\n", sum1,sum2,sum1/sum2*100)}'
280183,17707927,1.58%
real 0m15.465s
user 1m5.948s
sys 0m1.825s
| 执行文件个数 | thead_num | 第一次执行时长 | 第二次执行时长 | 第三次执行时长 | 平均执行时长 |
|---|---|---|---|---|---|
| 20 | 5 | 0m9.427s/1m4.480s | 0m9.471s/1m1.272s | 0m10.147s/1m6.279s | |
| 20 | 10 | 0m14.248s/1m3.904s | 0m17.910s/1m13.744s | 0m15.375s/1m6.976s | |
| 108 | 5 | 1m3.402s/4m44.106s | 1m4.843s/4m49.971s | 1m7.849s/4m58.970s | |
| 108 | 10 | 0m34.851s/4m50.733s | 0m32.681s/4m42.485s | 0m35.181s/4m52.255s | |
| 108 | 15 | 0m24.489s/4m51.772s | 0m23.029s/4m49.198s | 0m24.158s/4m45.858s | |
| 108 | 20 | 0m19.961s/4m59.860s | 0m18.436s/4m44.047s | 0m18.091s/4m42.589s |
# time sh scan.sh | awk -F'\t' '{sum1+=$2; sum2+=$3; }END{printf ("%d,%d,%.2f%%\n", sum1,sum2,sum1/sum2*100)}'
280183,17707927,1.58%
real 0m9.427s
user 1m4.480s
sys 0m2.000s
修改项,
1,2种方法,执行前检测是否还有进程在执行,有的话需要先kill掉原有的进程。
2,方法1,执行为n+m+1,可以尝试优输出count;方法2,当前方案执行为0.05n+m+1,0.05为符合if的数据。