linux day30 最新(三剑客命令共性,grep命令,sed,awk,expect)听的比较模糊,状态不好

今日内容:

1,grep命令&正则表达式(并不是grep独有的)

2,sed

3,awk

4,expect(A可斯拜可特):交互的命令变为非交互。写好代码,然后expect帮你去交互,

远程执行命令 ssh root@1.1.1.1 hostname (如果后面不加命令,就是远程登录,要求输入用户名,密码。)

 

grep,sed,awk,为什么叫三剑客命令,全称叫:文本处理三剑客,因为他们三个在处理文本的时候确实非常常用,各自有各自擅长的点。

  1,grep擅长过滤文本。

  2,sed把编辑文件变成非交互式修改,写脚本时用。

  3,awk擅长格式化有规律的文本,如passwd,对文本列进行操作。

  注:linux里一切皆文件,所以以后会非常常用。

  三剑客命令的共性:(并不是所有命令都支持正则表达式,如ls *,rm -rf*这不是正则表达式,这是元字符)

  1,都支持正则表达式

  2,都支持管道,同时都可以从管道里取出结果在做处理。

  例子:

    useraddd egon

    passwd egon 这样添加用户密码,会进入交互式环境

    echo 123 | passwd egon --stdin 而这种不需要,--stdin是标准输入的意思。

 

一,grep命令

  1,分为:

    grep

    egrep,支持扩展的正则表达式,支持的正则表达式更多。egrep等于grep -E

    2,grep命令格式:

    grep   选项     正则表达式     文件

首先为了简单易懂学习grep命令,先忽略正则表达式。

  head -10 /etc/passwd > test.txt 将passwd的前十行

  用法一,grep "root" test.txt 打开文件,每读一行,都用正则表达式去匹配一下,但凡匹配成功一次,该行就被过滤出来。

  用法二,cat test.txt | grep "root"

  

  grep的选项

    1,-n,过滤结果带行号。

    2,-o,只把过滤的成功的内容显示出来,

    3,-q,静默输出,判断过滤成功没,不想把过滤内容显示出来。

    -q的使用场景,假如现在要求,判断test.txt 是否包含有root的行

    grep "root" tset.txt

    if [ $? -eq 0 ];then

      echo "ok"

    else

       echo "no'

    fi

    给个执行权限,chmod +x 13.sh

    ./13.sh

    其实只是想打印ok还是no,这时候-p就达到需求。(还可以使用以前学习的在grep "root" tset.txt &>/dev/null)

    4,--color,不用管,默认就加上了颜色。

    5,-i 忽略大小写

    6,-A ,2,除了过滤的行,它的后两行也过滤出来

    7,-B,2,除了过滤到的行,它的前两行也会过滤出来

    8,-C,2,除了过滤的行,上下指定行过来出来。

    9,-C,统计出过滤成功的行数

    10,-v,取反的意思。grep -v "root" tset.txt

    11,-w,匹配单词

   

 

 

 

    12,-E , 等于egrep,扩展。

    这时候来一个需求,知道一个配置项,但是不知道它在哪。

     13 ,-l  ,显示那个文件名,不管哪一行,只要包含显示。

     14 ,-r,递归查找

      grep -rl "location" /etc/         rl一般都是搭配使用,找配置,不知道配置在哪个文件,非常常用。

 

正则表达式

  1,^,只从头开始匹配 grep -n "^root" /etc/passwd

  2,$只从末尾开始匹配 grep -n "bash$" /etc/passwd

 

 

 

    3,.

   4, * ,星左边的字符出现0次或无穷次,星贪婪的。ab*,最小是a

  

 

 

   5 .*

 

 第一行,会发现,它会选择最远的c,说明是贪婪的,但是贪婪通常是有害的。使用-P .*?

可以取消贪婪属性。

 

 

6[ ],相较于.可以任意指定,匹配指定范围的任意一个字符

如:[alcd2],就是这其中的一个字符都可以,[0-9]0到9的任意一个数字都可以,或者是[a-zA-Z]。

 

 

 

 这里-中括号里的减号,放在开头,或者结尾,如果-号两边有东西,就会变成一个从哪到哪的意思,经常报错。!号在正则表达式里只是普通符号。

这里如果再中括号内加上^就代表取反的意思,而如果再中括号外的a前面加^就代表从头开始匹配的意思。

7,+,左边的字符出现1次或者无穷次。和*有区别。

ab+,最小匹配的是ab,需要使用拓展,egrep

ab*,最小匹配的是a

 

 学这个干嘛使,怎么使用?

  现在需求是匹配整型数字。要求用户输入的必须是整型数字。

 

 二 sed命令

第一种场景,定位到某一行,然后将该文件的某一部分给替换掉

sed -r "定位+操作" test.txt

sed -r "3s/egon/EGON/gi" test.txt    (第一个egon是可以写正则的,但3才是定位的。如只把开图的egon换掉,"3s/^egon/EGON/gi")

 

 上图。

1,首先不加-i,-g,就是第三行从左匹配到右,只匹配小写egon,换成了6666。

2,然后加上-i,忽略大小写,但从左到右匹配一个就停下。

3,这时候加上g,从左到右全部匹配,同时还忽略大小写。

4,-r基础上,再加上-i,就会修改原文件。

 

 上图上下面俩个的实验。

sed -r "3,5操作" test.txt

sed -r "1操作;3操作"test.txt

 

sed -r "/^[a-zA-Z]/s/egon/EGON/gi" test.txt   代表把以字母开图的行,里的egon改成大写的EGON。

第二种场景,定位到某一行,然后删除

sed -r "1,3d" new.txt

sed -r "/^[0-9]/d" new.txt

第三种场景,在改行后添加新的配置

sed -r "1a xxxxxxxxxxx" new.txt     第一行添加

场景4:定位到某一行,在改行后添加新的配置

sed -r "1c xxxxxxxxxxxx" new.txt    第一行整行替换

 

sed它叫流式编辑器,它在一启动时,这个程序在内存运行起来了,文件内容test.txt在硬盘放着,它会把test.txt内容读一行到内存,然后根据“”号里的规则处理,如果引号没有内容,就会默认放到显示屏内,没有修改原文件,然后再读一行到内存,处理一下,然后放在显示屏,直到把原文件全部读完。如果想要修改原文件,加上-i就不是往屏幕里丢了,而是直接丢到原文件里去。不过不建议直接就-i,而是先编辑输出到屏幕上,看看有没有问题,然后再-i。

 

 这里的-r,是拓展正则表达式的意思。就是可以使用正则选项。

同时加上-i后,回城,然后查看new.txt文件,发现没变,但是其实已经改变,虽然一样,但是其实是进行了一次覆盖操作。新的把旧的覆盖了一次,只不过一模一样。

懂了这些原理,我们要做的就是定位到某一行,进行操作。首先是定位。

定位分为俩种方式:

  1,行号定位,

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''   2,正则定位,

三,awk命令

擅长做列处理,首先需要定位。

awk -F: "定义{}" 文件路径

awk -F: 'NR==3 {print $1,$7}' /etc/passwd   定位到第三行

awk  -F 'NR>3 && NR<5{print $0} ' 文件路径

awk  -F 'NR>3 || NR<5{print $1"-"$3} '文件路径

 

awk -F '/bash$/{print $1}' /etc/passwd

 

获取ip地址:

 

 四,expect

用来把交互变成非交互,原理是一问一答,每敲一条命令,可能默认就是交互命令,ls直接返回一个东西。敲完一条命令,直接expect在原地捕捉这条命令给你返回的交互信息,如果它匹配上这个交互信息当中包含某一个字符的话,这就叫匹配成功。(它帮你完成交互)

  yum install expect -y

 

 根据上面的模板,修改需求。

 

posted @ 2021-04-13 19:02  sagelasi  阅读(125)  评论(0编辑  收藏  举报