用shell awk解决所有牛客网-SHELL篇练习问题

Posted EbowTang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用shell awk解决所有牛客网-SHELL篇练习问题相关的知识,希望对你有一定的参考价值。

本文将用shell awk解决所有牛客网-SHELL篇练习问题,无论该问题是否适合使用awk,

目的在于强化、熟练,拓展运用awk

本文参考自自我总结的:shell三剑客-awk总结_EbowTang的博客-CSDN博客

如果该问题实在太简单了,尽可能采用多种方式实现,本文长期更新

描述1,统计文件的行数


写一个 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

#! /bin/bash
1
awk 'END print NR' #NR就是行数的代表
2
awk 'count = count + 1END print count' #awk的计数功能
3
awk 'length($0) > 0 count = count + 1 END print count'#awk的模式-动作,条件计数功能
4
awk 'NF > 0 count = count + 1 END print count' #NF就是该行的字段数

描述2,打印文件最后五行


经常查看日志的时候,会从文件的末尾往前查看,于是请你写一个 bash脚本以输出一个文本文件 nowcoder.txt中的最后5行
示例:
假设 nowcoder.txt 内容如下:
#include<iostream>
using namespace std;
int main()

int a = 10;
int b = 100;
cout << "a + b:" << a + b << endl;
return 0;

#! /bin/bash
1
tail -5 $1
2
tailf -n -5 $1
3
tail -n 5 $1
4
#! /bin/bash
awk ' line[NR] = $0  \\
END  i = NR - 4
while(i <= NR)  
print line[i] 
i = i + 1  
' $1
5
awk 'NR>=4print $0' nowcoder.txt

描述3,打印7的倍数


写一个 bash脚本以输出数字 0 到 500 中 7 的倍数(0 7 14 21...)的命令

#! /bin/bash
awk ' 
for(i=0;i<=500;i=i+1)
    if(i % 7 == 0)
        print i

'

描述4,输出第五行的内容


写一个 bash脚本以输出一个文本文件 nowcoder.txt 中第5行的内容。
示例:
假设 nowcoder.txt 内容如下:
welcome
to
nowcoder
this
is
shell
code

你的脚本应当输出:
is

#! /bin/bash
awk 'NR==5print $0'

描述5,打印空行的行号


写一个 bash脚本以输出一个文本文件 nowcoder.txt中空行的行号,可能连续,从1开始
示例:
假设 nowcoder.txt 内容如下:
a
b

c

d

e


f

#! /bin/bash
awk 'NF == 0print NR'

描述6,去掉文件中的空行

写一个 bash脚本以去掉一个文本文件 nowcoder.txt中的空行
示例:
假设 nowcoder.txt 内容如下:

abc

567


aaa
bbb



ccc


你的脚本应当输出:
abc
567
aaa
bbb
ccc

#! /bin/bash
1
awk 'NF == 0 next print $0'
2
awk 'NF > 0 print $0'

描述7,统计单词长度小于8的单词

写一个 bash脚本以统计一个文本文件 nowcoder.txt中字母数小于8的单词。
示例:
假设 nowcoder.txt 内容如下:
how they are implemented and applied in computer 

你的脚本应当输出:
how
they
are

and

applied

in
说明:
不要担心你输出的空格以及换行的问题

#! /bin/bash
#$1代表该行第一个字段
#NF代表列数
#根据本题来看,无需模式匹配,直接判断
awk 'for(i=1;i<=NF;i++) \\
    if (length($i) <8)
         print $i
'

描述8,统计进程占用多少内存

假设 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文件下面的
请你写一个脚本计算一下所有进程占用内存大小的和:

#! /bin/bash
awk 'memuse = memuse + $6 END print memuse'

描述14 求平均值 

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

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

那么平均值为:5.000(保留小数点后面3位)
你的脚本获取以上输入应当输出:
5.000

#! /bin/bash
awk 'NR == 1  next  sum=sum+$NF END val = sum/(NR-1); printf("%.3f\\n",val) '

描述13 去掉所有包含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

 

你的脚本获取以上输入应当输出:

that is your bag

to the degree or extent indicated.
welcome to nowcoder

说明:
你可以不用在意输出的格式,包括空格和换行

#! /bin/bash
awk '/this/next print $0'

描述15 去掉不需要得行

写一个 bash脚本以实现一个需求,去掉输入中的含有B和b的单词
示例:
假设输入如下:
big
nowcoder
Betty
basic
test


你的脚本获取以上输入应当输出:
nowcoder test

说明:
你可以不用在意输出的格式,空格和换行都行

#! /bin/bash
awk '/B|b/  next  print $0'

描述16  判断输入的IP是否正确

写一个脚本统计文件nowcoder.txt中的每一行是否是正确的IP地址。

如果是正确的IP地址输出:yes

如果是错误的IP地址,四段号码的话输出:no,否则的话输出:error

假设nowcoder.txt内容如下

192.168.1.1
192.168.1.0
300.0.0.0
123

你的脚本应该输出

yes

yes

no

error

#! /bin/bash
awk -F "." '
if( NF == 4 )
    for(i=1;i<=NF;i=i+1)
        if($i > 255)
            print "no";
            break
        
    if(i==5)print "yes"

else
     print "error"
'

描述17 将字段逆序输出文件的每行

将字段逆序输出文件nowcoder.txt的每一行,其中每一字段都是用英文冒号: 相分隔。

假设nowcoder.txt内容如下:

nobody:*:-2:-2:Unprivileged User:/var/empty:/usr/bin/false

root:*:0:0:System Administrator:/var/root:/bin/sh

你的脚本应当输出

/usr/bin/false:/var/empty:Unprivileged User:-2:-2:*:nobody

/bin/sh:/var/root:System Administrator:0:0:*:root

#! /bin/bash
awk -F ':' ' 
    for (i = NF; i > 0; i = i - 1) 
        if (i==1)
            printf("%s", $i)
        else
            printf("%s:", $i)
    printf("\\n")
'

以上是关于用shell awk解决所有牛客网-SHELL篇练习问题的主要内容,如果未能解决你的问题,请参考以下文章

牛客编程题shell34题(Linux awk,grep命令)

牛客网-下厨房(网易)

牛客Shell实战题目1~8

shell之awk

牛客网在线编程:分苹果

用awk如何读取shell命令行上的参数(参数可以是带空格的)