牛客网 Shell题库 全解

本文介绍了多种Linux Shell脚本的实用技巧,包括统计文件行数、打印文件尾部内容、查找数字模式、处理空行、计算内存使用、单词统计、进程监控等。通过示例展示了awk、sed、grep等命令的高效用法,帮助提升Shell脚本编程能力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

1. 统计文件的行数

2.打印文件最后五行

3.输出7的倍数

4.输出第五行的内容

5.打印空行的行号

6. 去掉空行

7. 打印字母数小于8的单词

8. 统计所有进程占用内存大小之和

9.统计每个单词出现的个数

10.第二列是否有重复

11.转置文件内容

12.打印每一行出现的数字个数

13.去掉所有包含this的句子

14.求平均值

15.去掉不需要的单词

参考


1. 统计文件的行数

awk '{print NR}' nowcoder.txt|tail -n1

现成的wc命令为何不用?

wc -l

2.打印文件最后五行

cat nowcoder.txt | tail -5

tail命令经常使用,比如查看当前后台wget下载进度的时候:tail -f wget-log

3.输出7的倍数

主要考察for+if的用法

#!/bin/bash
for i in {0..500}
    do
        if [[ i%7 -eq 0 ]];then
            echo $i
        fi
    done

4.输出第五行的内容

#!/bin/bash
# head提取前5行,tail提取前五行中的最后一行
head -n 5 nowcoder.txt | tail -n 1
# 或者直接用sed
sed -n '5p'
# awk
cat nowcoder.txt | awk "NR==5"

5.打印空行的行号

sed -n '/^$/='
#!/bin/bash
sed -n '/^\s*$/='

正则表达式里面,^表示从头开始匹配,$表示从末尾开始匹配。

顺便复习一下sed的全部语法命令:





  • sed 是逐行处理软件,我们可能仅输入了一条 sed 指令,但系统会将该指令应用在所有匹配的数据行上,因此相同的指令会被反复执行 N 次,这取决于匹配到的数据有几行。
  • 默认 sed 不支持扩展正则,如果希望使用扩展正则匹配数据,可以使用-r 参数。
  • sed 程序使用=指令可以显示行号,结合条件匹配,可以显示特定数据行的行号。
  • 在 sed 中支持使用感叹号(!)对匹配的条件进行取反操作。

6. 去掉空行

上一题的延伸,还是使用sed

#!/bin/bash
sed '/^\s*$/d'

7. 打印字母数小于8的单词

用awk,NF表示当前字段的个数

cat nowcoder.txt | awk '{
for (i=1;i<=NF;i++) {
    if (length($i)<8)
        print $i
}
}'

8. 统计所有进程占用内存大小之和

#!/bin/bash
cat nowcoder.txt | awk '{sum+=$6}END{print sum}'

9.统计每个单词出现的个数

先把空格换成换行符,然后排序并输出频率,然后交换左右两列的顺序输出,最后按照第二列的排序升序输出

cat nowcoder.txt | tr -s ' ' '\n' | sort | uniq -c | awk '{print $2" "$1}' | sort -k2n

10.第二列是否有重复

先用awk找出第二列,然后计数排序,输出出现数量大于1的行,最后再排序一下输出。

cat nowcoder.txt | awk '{print $2}' | sort | uniq -c | awk '{if($1>1){print $1" "$2}}' | sort

11.转置文件内容

这题和LeetCode 194 一模一样~

cat nowcoder.txt | awk '{for(i=1;i<=NF;i++){if(NR==1){res[i]=$i;}else{res[i]=res[i]" "$i}}}END{for(i=1;i<=NF;i++)print res[i]}'

12.打印每一行出现的数字个数

先晾着吧,awk yyds。。。

13.去掉所有包含this的句子

grep -v 'this'

14.求平均值

awk 'NR==1{all=$0} NR>1{total+=$0} END{printf "%.3f" ,total/all}'

15.去掉不需要的单词

grep -vP '(\w){0,}[b,B](\w){1,}'

参考

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

沉迷单车的追风少年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值