分享

Shell进阶必会的几个工具, 你都掌握了吗? (附真实企业面试题)

 bdpqlxz 2020-09-12

写在前面: 博主是一名大数据行业的蒟蒻小白,昵称来源于《爱丽丝梦游仙境》中的Alice和自己的昵称。作为一名互联网小白,写博客一方面是为了记录自己的学习历程,一方面是希望能够帮助到很多和自己一样处于起步阶段的萌新。由于水平有限,博客中难免会有一些错误,有纰漏之处恳请各位大佬不吝赐教!个人小站:http://alices./ , 博客主页:https://alice.blog.csdn.net/

尽管当前水平可能不及各位大佬,但我还是希望自己能够做得更好,因为一天的生活就是一生的缩影。我希望在最美的年华,做最好的自己!

在之前的一篇博客👉《零基础小白如何入门Shell,快来看看(收藏)这篇大总结!!》中,博主已经为大家介绍了Shell常见的入门级操作,本篇博客,我们就来学习一些进阶的内容,并且还附带一些对应的测试题。感兴趣的小伙伴们记得点个赞以表支持哟~

点击加载图片

文章目录

常用的Shell工具

1、cut

1.1 基本用法

1.2 选项参数说明

1.3 案例实操

2、sed

2.1 基本用法

2.2 选项参数说明

2.3 命令功能描述

2.4 案例实操

3、awk

3.1 基本用法

3.2 选项参数说明

3.3 案例实操

3.4 awk的内置变量

3.5 案例实操

4、sort

4.1 基本语法

4.2 案例实操

企业真实面试题

1、京东

2、搜狐&和讯网

3、新浪

3、金和网络

小结

常用的Shell工具

1、cut

cut的工作就是“剪”,具体的说就是在文件中负责剪切数据用的。cut命令从文件的每一行剪切字节,字符和字段并将这些字节,字符和字段输出

1.1 基本用法

cut[选项参数] filename

说明: 默认分隔符是制表符

1.2 选项参数说明

选项参数功能
-f列号,提前第几列
-d分隔符,按照指定分隔符分割列

1.3 案例实操

(0) 数据准备

[root@node01 datas]# touch cut.txt[root@node01 datas]# vim cut.txt dong shen

guan zhen

wo wo

lai lai

le le

(1)切割 cut.txt 第一列

[root@node01 datas]# cut -d ' ' -f 1 cut.txt dong

guan

wo

lai

le

(2)切割cut.txt第二,三列

[root@node01 datas]# cut -d ' ' -f 2,3 cut.txt shen

zhen

wo

lai

le

(3)在cut.txt文件中切割出guan

[root@node01 datas]# cat cut.txt | grep 'guan' | cut -d ' ' -f 1 guan

(4)选取系统PATH变量值,第2个“:”开始后的所有路径:

[root@node01 datas]# echo $PATH/usr/lib64/qt-3.3/bin::/export/servers/kafka-eagle-bin-1.3.2/kafka-eagle-web-1.3bin::/export/servers/jdk1.8.0_144/bin:::/export/servers/hbase-1.1.1/bin::/exportrvers/hadoop-2.6.0-cdh5.14.0/bin:/export/servers/hadoop-2.6.0-cdh5.14.0/sbin:/usocal/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/export/servers/hive-1.1.dh5.14.0/bin:/export/servers/kafka_2.11-1.0.0//bin:/export/servers/pig/bin:/exposervers/spark/bin:/export/servers/sqoop-1.4.6.bin__hadoop-2.0.4-alpha/bin:/exporervers/zookeeper-3.4.5-cdh5.14.0/bin:/root/bin [root@node01 datas]# echo $PATH | cut -d : -f 2- :/export/servers/kafka-eagle-bin-1.3.2/kafka-eagle-web-1.3.2/bin::/export/servers/jdk1.8.0_144/bin:::/export/servers/hbase-1.1.1/bin::/export/servers/hadoop-2.6.0-cdh5.14.0/bin:/export/servers/hadoop-2.6.0-cdh5.14.0/sbin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/export/servers/hive-1.1.0-cdh5.14.0/bin:/export/servers/kafka_2.11-1.0.0//bin:/export/servers/pig/bin:/export/servers/spark/bin:/export/servers/sqoop-1.4.6.bin__hadoop-2.0.4-alpha/bin:/export/servers/zookeeper-3.4.5-cdh5.14.0/bin:/root/bin

(5)切割 ifconfig 后打印的IP地址

[root@node01 datas]# ifconfig eth0 | grep 'inet addr' | cut -d: -f 2 | cut -d' ' -f1 192.168.100.100

2、sed

sed是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”,接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。

2.1 基本用法

sed[选项参数] ‘command’ filename

2.2 选项参数说明

选项参数功能

-e直接在指令模式上进行sed的动作编辑

2.3 命令功能描述

命令功能描述
a新增,a的后面可以接字符串,在下一行出现
d删除
s查找并替换

2.4 案例实操

(0) 数据准备

[root@node01 datas]# touch sed.txt[root@node01 datas]# vim sed.txt dong shen

guan zhen

wo wo

lai lai

le le

(1) 将“mei nv”这个单词插入到sed.txt第二行下,打印

[root@node01 datas]# sed '2a mei nv' sed.txt dong shen

guan zhen

mei nv wo wo

lai lai

le le

注意:文件并没有改变

(2) 删除 sed.txt 文件所有包含 wo 的行

[root@node01 datas]# sed '/wo/d' sed.txt dong shen

guan zhen

lai lai

le le

(3) 将sed.txt文件中wo替换为ni

[root@node01 datas]# sed 's/wo/ni/g' sed.txt dong shen

guan zhen nini lai lai

le le

注意:‘g’表示global,全部替换

(4) 将sed.txt文件中的第二行删除并将wo替换为ni

[root@node01 datas]# sed -e '2d' -e 's/wo/ni/g' sed.txt dong shen nini lai lai

le le

3、awk

一个强大的文本分析工具,把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行分析处理。

3.1 基本用法

awk [选项参数] ‘pattern1{action1} pattern2{action2}…’ filename

pattern : 表示AWK在数据中查找的内容,就是匹配模式

action:在找到匹配内容时所执行的一系列命令

3.2 选项参数说明

选项参数功能
-F指定输入文件折分隔符
-v赋值一个用户定义变量

3.3 案例实操

(0) 数据准备

[root@node01 datas]# cp /etc/passwd ./

(1) 搜索passwd文件以root关键字开头的所有行,并输出该行的第7列

[root@node01 datas]# awk -F : '/^root/{print $7}' passwd/bin/bash

(2) 搜索passwd文件以root关键字开头的所有行,并输出该行的第1列和第7列,中间以“,”号分割

[root@node01 datas]# awk -F : '/^root/{print $1','$7}' passwd root,/bin/bash

注意:只有匹配了pattern的行才会执行action

(3) 只显示 passwd 文件的第一列和第七列,以逗号分割,且在第一行内容前面添加列名user,shell在最后一行添加内容dahaige,/bin/zuishuai

[root@node01 datas]# awk -F : 'BEGIN{print 'user,shell'}{print $1','$7} END{print 'dahaige,/bin/zuishuani'}' passwd user,shell

root,/bin/bash

bin,/sbin/nologin ...... hadoop,/bin/bash

dahaige,/bin/zuishuani

注意:BEGIN 在所有数据读取行之前执行;END 在所有数据执行之后执行。

(4)将passwd文件中的用户id增加数值1并输出

[root@node01 datas]# awk -v i=1 -F : '{print $3 + i}' passwd 1

2

3

4 ......

3.4 awk的内置变量

变量说明
FILENAME文件名
NR已读的记录数
NF浏览记录的域的个数(切割后,列的个数)

3.5 案例实操

(1) 统计 passwd 文件名,每行的行号,每行的列数

[root@node01 datas]# awk -F : '{print 'filename:' FILENAME ',linenumber:' NR ',columns:' NF}' passwd filename:passwd,linenumber:1,columns:7

filename:passwd,linenumber:2,columns:7

filename:passwd,linenumber:3,columns:7 ......

4、sort

sort 命令在Linux里非常有用,它将文件进行排序,并将排序结果标准输出。

4.1 基本语法

sort(选项)(参数)

选项说明
-n依照数值的大小排序
-r以相反的顺序来排序
-t设置排序时所用的分隔字符
-k指定需要排序的列

参数:指定待排序的文件列表

4.2 案例实操

(0) 数据准备

[root@node01 datas]# touch sort.sh[root@node01 datas]# vim sort.sh bb:40:5.4

bd:20:4.2

xz:50:2.3

cls:10:3.5

ss:30:1.6

(1) 按照 ' : ' 分割后的第三列倒序排序。

[root@node01 datas]# sort -t : -nrk 3 sort.sh bb:40:5.4

bd:20:4.2

cls:10:3.5

xz:50:2.3

ss:30:1.6

点击加载图片

看到这里的朋友,一定对于Shell有了新的认知,但是我们了解得再多,终归还是需要通过实践来测试我们的能力。下面菌哥放上几道关于Shell的企业真实面试题,感兴趣的朋友可以测试一下~

点击加载图片

企业真实面试题

1、京东

问题1:使用Linux命令查询 sed.txt 中空行所在的行号

awk '/^$/{print NR}' sed.txt

问题2:有文件 chengji.txt 内容如下:

张三 40

李四 50

王五 60

使用Linux命令计算第二列的和并输出

cat chengji.txt | awk -F ' ' '{sum+=$2} END{print sum}'

2、搜狐&和讯网

问题1:Shell脚本里如何检查一个文件是否存在?如果不存在该如何处理?

#!/bin/bashif[-f file.txt ]; then echo'文件存在!'elseecho'文件不存在!' fi

3、新浪

问题1:用shell写一个脚本,对文本中无序的一列数字排序

[root@node01 datas]# cat demo.txt 9

8

7

6

5

4

3

2

10

1 [root@node01 datas]# sort -n demo.txt | awk '{a+=$0;print $0}END{print 'SUM='a}' 1

2

3

4

5

6

7

8

9

10

SUM=55

3、金和网络

问题1:请用shell脚本写出查找当前文件夹下所有的文本文件内容中包含有字符”shen”的文件名称

[root@node01 datas]# grep -r 'shen' ../sed.txt:dong shen ./cut.txt:dong shen [root@node01 datas]# grep -r 'shen' . | cut -d ':' -f 1./sed.txt ./cut.txt

小结

本篇博客介绍了Shell常用的几种工具:cut,sed,awk,sort。这些工具不论是在Linux的开发,还是在大数据运维环境下,使用的频率都很高,热爱学习的小伙伴们记得勤加练习哟~

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多