shell例题-15道来自牛客网

本文分享了来自牛客网的15道Shell编程题目,包括统计文件行数、打印文件尾部、找出7的倍数、输出特定行、处理空行等,覆盖了文件操作、文本处理和流程控制等多个方面,适合Shell初学者练习。

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


以下例题均来自于牛客网shell练习

SHELL1 统计文件的行数

  • 题目描述:写一个 bash脚本以输出一个文本文件 nowcoder.txt中的行数
  • 示例:假设 nowcoder.txt 内容如下:
#include <iostream>
using namespace std;
int main()
{
    int a = 10;
    int b = 100;
    cout << "a + b:" << a + b << endl;
    return 0;
}
  • 你的脚本应当输出:
9
  • 有多种求解方法
cat nowcoder.txt | wc -l
cat nowcoder.txt | awk '{print NR}'| tail -n1
cat nowcoder.txt | awk 'END{print NR}'

SHELL2 打印文件的最后5行

  • 经常查看日志的时候,会从文件的末尾往前查看,于是请你写一个 bash脚本以输出一个文本文件 nowcoder.txt中的最后5行
cat nowcoder.txt | tail -n 5

SHELL3 输出7的倍数

  • 写一个 bash脚本以输出数字 0 到 500 中 7 的倍数(0 7 14 21…)的命令
#echo `seq 0 7 500`
for (( i=0;i<=500;i+=7 ))
do echo $i
done	
  • 我认为第一行的方法也行的通,但是不知道为什么无法通过

SHELL4 输出第5行的内容

  • 写一个 bash脚本以输出一个文本文件 nowcoder.txt 中第5行的内容。
- cat nowcoder.txt | head -n 5 | tail -n 1

SHELL5 打印空行的行号

  • 写一个 bash脚本以输出一个文本文件 nowcoder.txt中空行的行号,可能连续,从1开始

  • 示例:假设 nowcoder.txt 内容如下:

在这里插入图片描述

你的脚本应当输出:

3
5
7
9
10
cat nowcoder.txt | awk '{if (length ==0 ) print NR}'

SHELL6 去掉空行

  • 写一个 bash脚本以去掉一个文本文件 nowcoder.txt中的空行

  • 示例:假设 nowcoder.txt 内容如下
    在这里插入图片描述

  • 你的脚本应当输出:

abc
567
aaa
bbb
ccc
  • 有多种方法
#cat nowcoder.txt | awk '{if (length != 0) print $0}'
#cat nowcoder.txt|awk '{if($0!="")print $0}'
#cat nowcoder.txt | sed '/^$/d'
#cat nowcoder.txt | tr -s '\n'
grep -v '^$' nowcoder.txt

SHELL7 打印字母数小于8的单词

  • 题目描述
    写一个 bash脚本以统计一个文本文件 nowcoder.txt中字母数小于8的单词。

  • 示例:假设 nowcoder.txt 内容如下:

how they are implemented and applied in computer 
  • 你的脚本应当输出:
how
they
are
and
applied
in
  • 说明:不要担心你输出的空格以及换行的问题
cat nowcoder.txt | awk '{
for (i=1;i<=NF;i++){
        if (length($i) < 8)
                print $i
}
}'
  • 开始尝试了很多方法,使用了外部循环,内部使用awk的方法,但是总是出错,最后究其原因,是因为外部定义的变量i,下面调用的时候需要使用$i,所以awk这里就需要$($i),通过实践,这样的方法不能正确输出。
n=`cat nowcoder.txt | awk '{print NF}'|head -n 1`##计算列数
i=1
while  [ $i -le $n ]
do
        cat nowcoder.txt| awk '{if (length($($i)) < 8) print $($i)}'
        let i++
done
  • 这个方法目前还无法正确输出,于是索性直接在awk内部建立循环。

SHELL8 统计所有进程占用内存大小的和

  • 假设 nowcoder.txt 内容如下:

root 2 0.0 0.0 0 0 ? S 9月25 0:00
[kthreadd] root 4 0.0 0.0 0 0 ? I< 9月25
0:00 [kworker/0:0H] web 1638 1.8 1.8 6311352 612400 ? Sl
10月16 21:52 test web 1639 2.0 1.8 6311352 612401 ? Sl
10月16 21:52 test tangmiao-pc 5336 0.0 1.4 9100240 238544
?? S 3:09下午 0:31.70 /Applications

  • 以上内容是通过ps aux | grep -v ‘RSS TTY’ 命令输出到nowcoder.txt文件下面的
    请你写一个脚本计算一下所有进程占用内存大小的和:
#ps aux | grep -v RSS|awk '{sum=sum+$6};END{print sum}'
#ps aux |awk -F' ' '{(sum=sum+$6)};END{print sum}'
cat $1|awk -F ' ' '{(sum=sum+$6)}END{print sum}'
  • 此题我开始一直无法通过,因为指令不是自己直接输入的,而是通过脚本读取的方法。

SHELL9 统计每个单词出现的个数

  • 写一个 bash脚本以统计一个文本文件 nowcoder.txt 中每个单词出现的个数。

  • 为了简单起见,你可以假设:nowcoder.txt只包括小写字母和空格。
    每个单词只由小写字母组成。单词间由一个或多个空格字符分隔。

  • 示例:假设 nowcoder.txt 内容如下:

welcome nowcoder
welcome to nowcoder
nowcoder
  • 你的脚本应当输出(以词频升序排列):
to 1 
welcome 2 
nowcoder 3 
cat nowcoder.txt | tr -s ' ' '\n'| sort |uniq -c|sort -n| awk '{print $2 $1}'

tr -s ' ' '\n' 将空格全部转换为换行,使每个单词单为一列
sort 先进行排序,此步很重要,uniq -c 统计个数之前必须有这一步
sort -n 进行纯数字排序

SHELL10 第二列是否有重复

  • 给定一个 nowcoder.txt文件,其中有3列信息,如下实例,编写一个sheel脚本来检查文件第二列是否有重复,且有几个重复,并提取出重复的行的第二列信息:
  • 实例:
20201001 python 99
20201002 go 80
20201002 c++ 88
20201003 php 77
20201001 go 88
20201005 shell 89
20201006 java 70
20201008 c 100
20201007 java 88
20201006 go 97
  • 结果:
2 java
3 go
  • 这个过程和上道题思路很像
s=`cat nowcoder.txt|awk '{print $2}'`
echo  $s| tr -s ' ' '\n'|sort|uniq -c| grep -v 1| sort -n

SHELL11 转置文件的内容

  • 写一个 bash脚本来转置文本文件nowcoder.txt中的文件内容。

  • 为了简单起见,你可以假设:你可以假设每行列数相同,并且每个字段由空格分隔

  • 示例:假设 nowcoder.txt 内容如下:

job salary
c++ 13
java 14
php 12
  • 你的脚本应当输出(以词频升序排列):
job c++ java php
salary 13 14 12
s1=`cat nowcoder.txt|awk '{print $1}'`
s2=`cat nowcoder.txt|awk '{print $2}'`
echo $s1|sort
echo $s2|sort

SHELL12 打印每一行出现的数字个数

  • 写一个 bash脚本以统计一个文本文件 nowcoder.txt中每一行出现的1,2,3,4,5数字个数并且要计算一下整个文档中一共出现了几个1,2,3,4,5数字数字总数。

  • 示例:假设 nowcoder.txt 内容如下:

a12b8
10ccc
2521abc
9asf
  • 你的脚本应当输出:
line1 number: 2
line2 number: 1
line3 number: 4
line4 number: 0
sum is 7
  • 这个题我没有通过牛客网上的检测,但是我自己检验正确,目前还没有找到原因
sum=0
n=`cat nowcoder.txt| awk '{print NR}'|tail -n 1` 
for i in `seq 1 $n`
do
        a=`cat nowcoder.txt |head -n $i|tail -n 1| grep -E  -o '[1-5]' | egrep -c '[1-5]'`
        echo line$i number:$a
        sum=$[$sum+$a]
done
echo sum is $sum
  • grep -E -o '[1-5]'精确匹配
  • egrep -c '[1-5]'包含关键字的行数
  • 为什么不直接进行计数呢?因为若一行存在多个关键字,只计数一次,所以需要先经过精确匹配

SHELL13 去掉所有包含this的句子

  • 写一个 bash脚本以实现一个需求,去掉输入中含有this的语句,把不含this的语句输出
  • 示例:假设输入如下:
that is your bag
is this your bag?
to the degree or extent indicated.
there was a court case resulting from this incident
welcome to nowcoder
  • 你的脚本获取以上输入应当输出:
to the degree or extent indicated.
welcome to nowcoder
cat nowcoder.txt | grep -v this

SHELL14 求平均值

  • 写一个bash脚本以实现一个需求,求输入的一个的数组的平均值

  • 第1行为输入的数组长度N,第2~N行为数组的元素,如以下为:数组长度为4,数组元素为1 2 9 8

  • 示例:

4
1
2
9
8
  • 那么平均值为:5.000(保留小数点后面3位),你的脚本获取以上输入应当输出:
5.000
n=`cat nowcoder.txt|head -n 1`
m=$(($n+1))
sum=0
for i in `seq 2 $m`
do
num=`cat nowcoder.txt|head -n $i| tail -n 1`
sum=$[ $sum+$num ]
done
ave=$(printf "%.3f" `echo "scale=3;$sum/$n"|bc`)
echo $ave
  • 我觉得这个题的难点在于如何把小数点保留三位输出
  • 示例:
$> res=$(printf "%.5f" `echo "scale=5;1/3"|bc`)
$> echo $res
0.33333

SHELL15 去掉不需要的单词

  • 写一个 bash脚本以实现一个需求,去掉输入中的含有B和b的单词
  • 示例:假设输入如下:
big
nowcoder
Betty
basic
test
  • 你的脚本获取以上输入应当输出:
nowcoder test
#echo `cat nowcoder.txt|grep  -v 'B\|b'`
echo `cat nowcoder.txt| grep -E -v 'B|b'`

-E 代表使用正则表达式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值