统计文件行数
# 统计文件行数 cat nowcoder.txt | wc -l
打印文件最后5行
tail -n -5 nowcoder.txt #以下一样,展示文件最后5行: tail -n 5 nowcoder.txt tail -n5 nowcoder.txt tail -5 nowcoder.txt #不写默认10行 #展示从第5行开始到文件末尾 tail -n +5 nowcoder.txt #展示文件最后10个字符 tail -c -10 nowcoder.txt #动态显示文件最后10行,直至CTRL+C结束,常用看日志增长 tail -f logs.txt
输出7的倍数
——shell生成list、array的方法参考:https://www.jb51.net/article/69168.htm
for i in {0..500..7} #shell生成list的方法 do echo $i done #补充错误做法,待排查 #if条件表达式要放在方括号之间,并且要有空格,例如: [$a==$b] 是错误的,必须写成 [ $a == $b ] a=0 while(( $a < 500 )) #写方括号不行,换成圆括号可以AC,不知道原因 do echo $a a=$(( $a + 7 )) done
输出文档第五行的内容
sed参考sed菜鸟教程
cat nowcoder.txt | head -5 | tail -1 # 用awk,NR是内建变量。用法:1.awk [pattern] filename; 2.awk -f awk_code filename awk "NR==5" nowcoder.txt # 用sed: sed -n 'm,np' filename 查看m-n行;p指print,d指delete
sed -n '5p' nowcoder.txt
打印空行行号
# awk '{[pattern] action}' {filenames};正则表达式要加在两条正斜杠 awk '/^$/ {print NR}' nowcoder.txt #sed =是指打印行号? sed -n '/^$/ =' nowcoder.txt # grep运行不成功 grep -n '^$' nowcoder.txt
删除空行
# grep:这里grep为什么可以运行成功? grep -v '^$' nowcoder.txt # sed:这里如果写sed -n '/^$/d' nowcoder.txt会报错,去掉n可以AC sed '/^$/d' nowcoder.txt # awk awk '/./ {print}' nowcoder.txt awk '{if(( $0 != "" )) print}' nowcoder.txt
打印字母数小于8的单词
# $i表示第i列,$0表示整行,不要加引号;NF表共有多少列 awk '{for(i=1;i<=NF;i++)if( length($i) < 8 ) print $i}' nowcoder.txt
统计所有进程占用内存大小
先用ps aux | grep -v 'RSS TTY' 命令输出到nowcoder.txt
# 注意熟悉awk的语法,这里print $sum会报错 awk 'BEGIN{sum=0};{sum+=$6};END{print sum}' nowcoder.txt
统计每个单词出现的次数**
# 先用tr把每个单词处理为一列,即除了单词都处理为换行,s表示遇到连续的只处理一次;再用uniq统计出现次数,uniq处理前要求单词按字母排序,再根据单词出现次数排序,此时为n,word,再用awk调换一下顺序 cat nowcoder.txt |tr -cs [a-z] " " |sort|uniq -c|sort|awk '{print $2,$1}'
# 这种解法没懂,没看出来排序的操作在哪 awk '{for(i=1;i<=NF;i++)a[$i]++}END {for (i in a){print i,a[i]}}'
检查文件第二列是否有重复,并提取出重复信息
# awk有点类C写法 awk '{a[$2]+=1};END{for (i in a){if (a[i] > 1) print a[i],i}}' nowcoder.txt
转置文件内容
# 如果是第一行,转置后直接就是每一列的第一个元素;否则,将其拼接在每个arr[i]列,注意shell的字符串拼接不用写+号 #!/bin/bash awk '{for (i=1;i<=NF;i++){ if (NR == 1) arr[i]=$i else arr[i]=arr[i]" "$i }};END{ for(i=1;i<=NF;i++){ print arr[i] } }' nowcoder.txt
每一行出现的数字个数
awk 'BEGIN{sum=0}; {count=0; len=length($0); for (i=1;i<=len;i++){ s=substr($0,i,1) #拆出每一位,判断是否为数字1-5 if(0<s && s<6){ sum+=1; count+=1 } }printf("line%d number:%d ",NR,count); };END{ printf("sum is %d ",sum) }' nowcoder.txt
去掉文档所有包含this的句子**
# grep grep -v 'this' nowcoder.txt # sed: d表删除 sed '/this/d' nowcoder.txt # awk: shell的字符串包含可以用~ awk '$0 !~ /this/ {print $0}' nowcoder.txt
求输入数组的平均值,第一行是数组元素个数,结果保留三位小数
awk '{if (NR == 1){ total=$1} else{ a+=$1 }};END{printf("%.3f",a/total) }'
去掉不需要的单词(包含B与b)
# grep grep -v 'B' | grep -v 'b' grep -v '[Bb]' # sed sed '/[Bb]/d' # awk awk '$0 !~ /[Bb]/ {print $0}' #注意正则的写法