nowcoder-shell篇(grep、awk、sed为主)

统计文件行数

# 统计文件行数
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

输出文档第五行的内容

awk参考awk菜鸟教程; awk详细教程

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] "\n" |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\n",NR,count);
    };END{
    printf("sum is %d\n",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}'   #注意正则的写法

 

posted @ 2020-12-26 18:42  foolangirl  阅读(135)  评论(0编辑  收藏  举报