shell练习题(牛客网15道题)

文章目录

        • 1.统计文件的行数
        • 2.打印文件的最后5行
        • 3.输出7的倍数
        • 4.输出第5行的内容
        • 5.打印空行的行号
        • 6.去掉空行
        • 7.打印字母数小于8的单词
        • 8.统计所有进程占用内存大小的和
        • 9.统计每个单词出现的个数
        • 10.第二列是否有重复
        • 11.转置文件的内容
        • 12.打印每一行出现的数字个数
        • 13.去掉所有指定字符this的句子
        • 14.求平均值.
        • 15.去掉不需要的单词


本专题为Shell实战,包含各种常见的Shell基本命令和操作,比如awk和sed等。

1.统计文件的行数

写一个 bash脚本以输出一个文本文件 nowcoder.txt中的行数

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

#include 
using namespace std;
int main()
{
    int a = 10;
    int b = 100;
    cout << "a + b:" << a + b << endl;
    return 0;
}

方法1:

$ wc  -l  ./nowcoder.txt
8 ./nowcoder.txt
wc -l ./nowcoder.txt|awk '{print $1}'
8

方法2:

$ awk '{print NR}' ./nowcoder.txt 
1
2
3
4
5
6
7
8
9
awk '{print NR}' ./nowcoder.txt|tail -n 1
9

2.打印文件的最后5行

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

tail -n 5

3.输出7的倍数

写一个 bash脚本以输出数字 0 到 500 中 7 的倍数(0 7 14 21…)的命令
for i in {0…500…7}
do
echo $i
done

4.输出第5行的内容

写一个 bash脚本以输出一个文本文件 nowcoder.txt 中第5行的内容。
sed -n 5p ./nowcoder.txt

5.打印空行的行号

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

示例:

假设 nowcoder.txt 内容如下:
a
b

c

d

e


f

答案为:
3
5
7
9
10
awk '/^$/{print NR}' ./nowcoder.txt##方法1
sed -n '/^$/=' ./nowcoder.txt##方法2
awk '{if(NF==0)print NR}' ./nowcoder.txt##方法3

6.去掉空行

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

sed '/^$/d' ./nowcoder.txt|awk '{print $0}'##方法1:先删除空行,再打印剩下的内容(列)
awk '{if($0 !=""){print $0}}' ./nowcoder.txt##方法1:如果该列内容不为空,就打印该列的内容(列)
awk '!/^$/ {print $NF}'
awk NF ./nowcoder.txt
grep -v '^$' ./nowcoder.txt##显示不包含匹配文本的所有行。

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

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

方法1:
for i in `cat test2`
do
    if [  `echo $i |wc -m` -lt 9 ];then      %wc -m表示统计字符个数,注意每行最后的换行符也是个字符
        echo $i 
    fi
done

方法2:
for i in `cat test2`
do
    if [ $(echo $i |wc -L) -lt 8 ];then      %wc -L表示统计单词最大长度
        echo $i
    fi
done

方法3:
cat test2 | awk '{
for (i=1;i<=NF;i++){
        if (length($i) < 8)
                print $i
}
}'

整数比较判断语句

-eq(equal) 测试两个整数是否相等;比如 $A -eq $B
-ne(inequality) 测试两个整数是否不等;不等,为真;相等,为假;
-gt(greter than) 测试一个数是否大于另一个数;大于,为真;否则,为假;
-lt(less than) 测试一个数是否小于另一个数;小于,为真;否则,为假;
-ge(greter equal) 大于或等于
-le(less equal) 小于或等于

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

请你写一个脚本计算一下所有进程占用内存大小的和:

ps aux | grep -v 'RSS TTY' | head -n 10 > now.txt
vim file3.sh
#!/bin/bash
sum=0
while read line
do
    arr=(${line[@]})
    sum=$(($sum+arr[5]))
done

shell练习题(牛客网15道题)_第1张图片

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

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

cat $1 | tr -s ’ ’ ‘\n’ |sort |uniq -c|sort |awk ‘{print $2" "$1}’
##tr -s 去掉空行,uniq -c合并重复并统计重复个数。sort按顺序排列,awk交换第一列和第二列

10.第二列是否有重复

给定一个 nowcoder.txt文件,其中有3列信息,如下实例,编写一个sheel脚本来检查文件第二列是否有重复,且有几个重复,并提取出重复的行的第二列信息:

cat ./nowcoder.txt |awk '{print $2}'|sort|uniq -c |sort|grep -v 1
cat ./nowcoder.txt |sort -k 2|awk '{print $2}'|uniq -c |sort|grep -v 1
结果:
2 java
3 go

11.转置文件的内容

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

方法1
awk '{printf $1" "}' ./nowcoder.txt
awk '{printf $2" "}' ./nowcoder.txt

#方法2
awk '{print $1}' ./nowcoder.txt | tr "\n" " "
awk '{print $2}' ./nowcoder.txt | tr "\n" " "

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

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

awk '{
    gsub(/[^1-5]/,"",$0);
    print "line"NR" number: "length($0);
    sum+=length($0);
} END{print "sum is "sum}'

13.去掉所有指定字符this的句子

方法1:
grep -v 'this' ./nowcoder.txt        %反向匹配
方法2:
sed '/this/d'./nowcoder.txt         %d:删除  “//”: 包含要搜索的字符串
方法3:
sed -n 'this/!p' ./nowcoder.txt
方法4:
awk '$0!~/this/ {print $0}' ./nowcoder.txt     %检查当前$0(所有的列)不包含this随机输出  

14.求平均值.

写一个bash脚本以实现一个需求,求输入的一个的数组的平均值
第1行为输入的数组长度N
第2~N行为数组的元素

方法1
awk '{if(NR!=1)a+=$1} END{printf("%.3f\n",a/(NR-1))}'
方法2
awk 'BEGIN{SUM=0;}{if(NR!=1){sum+=$1;}}END{printf("%.3f\n",sum/(NR-1))}'
方法3
#!/bin/bash
read -p  "数组长度:" cnt
for ((i=1;i<=cnt;i++)){
read num;
sum=$(($sum+$num));
}

a=`awk 'BEGIN{printf("%.3f\n",'$sum'/'$cnt')}'`
echo $a

15.去掉不需要的单词

写一个 bash脚本以实现一个需求,去掉输入中的含有B和b的单词

grep -v -E 'b|B' nowcoder.txt
grep -iv "b"
grep -v '[bB]' 

cat nowcoder.txt | grep -v -E 'b|B' 
cat nowcoder.txt|grep -vi "b"

awk '$0!~/b|B/ {print $0}' nowcoder.txt
awk '!/[bB]/'

sed '/[Bb]/d'
sed '/b\|B/d'

你可能感兴趣的:(shell练习题)