Linux基础_统计行数

蛋蛋 2023年05月05日 40 0

参考:
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的数据。

Last Updated: 2023/05/06 16:59:55
记一次Linux虚拟内存跑满排查 linux基础命令_rysnc远程复制