• shell面试题整理


    1.给一个放有IP的文件,其中一个IP一行,统计哪个IP出现的次数最多。

    ip_input.txt内容如下:

    219.217.49.14

    175.43.4.87

    87.48.98.1

    59.73.38.25

    219.217.50.14

    59.92.48.32

    219.217.49.14

    59.72.38.142

    59.73.38.25

    219.217.49.14

    shell脚本实现如下:

    sort ip_input.txt | uniq -c | sort | tail -1 | awk ‘{print $2}’

     

    命令拆解结果如下:

    sort ip_input.txt:      sort ip_input.txt:|uniq -c                 
    175.43.4.87              1 175.43.4.87 
    219.217.49.14            3 219.217.49.14
    219.217.49.14            1 219.217.50.14
    219.217.49.14            1 59.72.38.142
    219.217.50.14            2 59.73.38.25
    59.72.38.142             1 59.92.48.32
    59.73.38.25              1 59.92.48.32
    59.73.38.25 
    59.92.48.32 
    87.48.98.1

     

    解析:在uniq -c(要加上-c,否则不会显示重复了多少次)之前要先排序,因为uniq是对连续的行进行检查。最后要注意的是awk 要用单引号,因为如果用双引号就会把$2解析掉为运行程序的第二个参数,用单引号就是原汁原味的awk用法,表示记录的第二个字段。

    2.打印出sshd服务的端口号和进程号

    首先观察netstat -anp| grep sshd的结果

    命令如下:root用户

    netstat -anp | grep sshd | sed -n ‘s/.*:::([0-9]*) .* ([0-9]*)/sshd/1 2/p’  

     

    需要对第4行进行获取解析,取出端口22和进程号7572

    利用sed命令的替换功能,格式如下:

    s/pattern/replacemen/flag

    其中pattern为我们要替换的文本,使用正则表达式表示的匹配模式,

    replacement为用来替换的由一般字符组成的字符串。

    flag为替换标志,p时,替换第1个符合规则的字符串,并且将缓冲区输出到标准输出g为全局匹配,会替换文本行中所有符合规则的字符串,但没有将缓冲区输出到标准输出。

    由题意可知,我们可以把227572提取出来,然后替换掉第4行,所以打印第4行时只会打印227572.因为sed是一行一行读地,所以其它行并不会输出,因为它们没有匹配。

    sed -n ‘s/.*:::([0-9]*) .* ([0-9]*)/sshd/1 2/p’

    其中-n把默认输出给禁止了,sed默认是输出所有文本地,主要说下正则表达式,这里在:::前面加上.*是为了把前面tcp 0 0 给包括进来到pattern这个正则表达式内,然后在([0-9]*)后面要加上一个空格后再加.*,才能把整个22做为一个整体后面用/1来引用,如果没有.*,则后面引用/1时会变为空。所以这里在用.*的时候,前一个字符要加上去,这里的前一个字符是空格符。(这里的是为了转义,

    后面的1 2在这里表示22 7572

    3.统计文本中出现某个单词的次数

    文件为ip_input.txt,这个文件是在之前的ip_input.txt的基础上添加多了一些字母,为了大写字母混用,加上符号,所以特意添加地,字符‘4’有18

    219.217.49.14 

    175.43.4.87 

    87.48.98.1 

    59.73.38.25 

    219.217.50.14 

    59.92.48.32 

    219.217.49.14 DF,SDF4SD,SDFad4sdf 

    59.72.38.142 

    59.73.38.25  dsaf4asdf as4e  

    219.217.49.14 219.217.49.14219.217.49.14 219.217.49.14

    命令如下:

    cat ip_input.txt | tr -c “[:alnum:]” “ ” | grep -c 4

    思路如下:

    因为grep-c选项只有统计某个单词出现的行数,所以必须把每个单词放一行,这就需要用到替换命令tr,利用tr把除了字母和数字之外的其它字符都用 ,即换行符替代。

    tr命令语法如下:

    tr [option]  set1 [set2]

    option选项如下所列:

    -c:用字符集set2替换字符集set1中没有包含的字符。这里set1我们用[:alnum:][alnum]表示所有字母字符与数字。 set2

    -d:删除字符集set1中重复的字符,不执行操作。

    -s: 压缩set1中重复的字符,去重。

    -t:将字符集set1set2转换。

    扩展:如果是统计字符出现的次数,则需改为

    more tt.txt|tr -sc [:alnum:] ‘ ’|sed ‘s/value/value /g’|grep -c value

    注意:如果想把它封装成一个.sh文件,如my.sh则需

    more $2|tr -sc [:alnum:] ‘ ’|sed “s/$1/$1 /g”|grep -c $1,

    直接./mysh value tt.txt,结果为7

    注意:sed中要用双引号才行,如果用单引号,则$1就不是指value,因为在单引号里用的sed命令的规则,而不是shell的规则。

    [root@Master my]# more tt.txt 
    valuevaluevalue
    value
    valueasf
    value 

     程序猿必读

  • 相关阅读:
    写代码的自动提示是怎么出来的...我的WebStorm中不能自动提示Bootstrap中的样式呢
    bootstrap 中是通过写less文件来生成css文件,用什么工具来编写呢?
    flexbox弹性盒模型
    oninput 属性
    操作文件
    深拷贝、浅拷贝、集合
    常用字符串方法
    字典-小练习
    字典
    元组
  • 原文地址:https://www.cnblogs.com/longzhongren/p/4417981.html
Copyright © 2020-2023  润新知