当前位置:   article > 正文

正则表达式以及文本三剑客grep、sed、awk

正则表达式以及文本三剑客grep、sed、awk

正则表达式匹配的是文本内容,文本三剑客都是针对文本内容。

grep:过滤文本内容

sed:针对文本内容进行增删改查

awk:按行取列

一、grep

grep的作用使用正则表达式来匹配文本内容

1、grep选项

-m:匹配几次之后停止

  1. #查找所有包含root的文本内容
  2. [root@localhost opt]# grep root /etc/passwd
  3. root:x:0:0:root:/root:/bin/bash
  4. operator:x:11:0:operator:/root:/sbin/nologin
  5. #使用-m选项匹配1次之后就停止
  6. [root@localhost opt]# grep -m 1 root /etc/passwd
  7. root:x:0:0:root:/root:/bin/bash

-v :取反 除了所要查的其他全部显示

  1. #除了root其他都打印
  2. [root@localhost opt]# grep -v root /etc/passwd

-n:显示匹配的行号

-c :只统计匹配的行数  

  1. [root@localhost opt]# grep -c root /etc/passwd
  2. 2

-o :仅限显示匹配到的结果

  1. #显示所有的root
  2. [root@localhost opt]# grep -o root /etc/passwd
  3. root
  4. root
  5. root
  6. root

-q :静默模式,不输出任何信息

-A (after) 数字:后几行

  1. #匹配到当前内容并附带3行
  2. [root@localhost opt]# grep -A 3 root /etc/passwd
  3. #定位
  4. root:x:0:0:root:/root:/bin/bash
  5. bin:x:1:1:bin:/bin:/sbin/nologin
  6. daemon:x:2:2:daemon:/sbin:/sbin/nologin
  7. adm:x:3:4:adm:/var/adm:/sbin/nologin
  8. --
  9. #定位
  10. operator:x:11:0:operator:/root:/sbin/nologin
  11. games:x:12:100:games:/usr/games:/sbin/nologin
  12. ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
  13. nobody:x:99:99:Nobody:/:/sbin/nologin

-B (before)数字:前几行

  1. #匹配到前面3
  2. [root@localhost opt]# grep -B 3 dn /etc/passwd
  3. postfix:x:89:89::/var/spool/postfix:/sbin/nologin
  4. tcpdump:x:72:72::/:/sbin/nologin
  5. test2:x:1000:1000:test2:/home/test2:/bin/bash
  6. #定位
  7. dn:x:1001:1001::/home/dn:/bin/bash

-C 数字 :前后各几行

  1. 显示zlm前后各3
  2. [root@localhost opt]# grep -C 3 zlm /etc/passwd
  3. tcpdump:x:72:72::/:/sbin/nologin
  4. test2:x:1000:1000:test2:/home/test2:/bin/bash
  5. dn:x:1001:1001::/home/dn:/bin/bash
  6. #定位
  7. zlm:x:1002:1002::/home/zlm:/bin/bash
  8. #定位
  9. zdm:x:1003:1003::/home/zdm:/bin/bash
  10. zxc:x:1010:1010::/home/zxc:/bin/bash
  11. nginx:x:1012:1012::/home/nginx:/sbin/nologin

-e :多个条件 逻辑或

-E:匹配扩展正则表达式

-f :匹配两个文件相同的内容,按顺序以第一个文件为准

  1. [root@localhost opt]# cat 111.txt
  2. qq
  3. 112
  4. 123
  5. [root@localhost opt]# cat 222.txt
  6. 123
  7. #匹配两个文件相同的内容,按顺序以第一个文件为准
  8. [root@localhost opt]# grep -f 111.txt 222.txt
  9. 123

-r :递归目录 目录下的文件内容,软连接不包含在内  

  1. #在opt目录下查找关于123123是内容)
  2. [root@localhost opt]# grep -r 123 /opt/
  3. /opt/xy102.txt:123
  4. /opt/222.txt:123
  5. /opt/test.txt:123
  6. /opt/dec/test.txt:123
  7. /opt/dec/xy102.txt:123
  8. /opt/111.txt:123

-R:递归目录 目录下的文件内容,软连接包含在内  

二、sort

sort:以行为单位对文件的内容进行排序

格式:

sort 选项 参数 或者使用cat file | sort 选项

-f :忽略大小写,先排数字,字母按顺序,默认就会把大写字母排在最前面

  1. [root@localhost opt]# cat 111.txt
  2. qq
  3. 112
  4. BBB
  5. 122
  6. AAA
  7. bbb
  8. 忽略大小写,先排数字,字母按顺序
  9. [root@localhost opt]# sort -f /opt/111.txt
  10. 112
  11. 122
  12. AAA
  13. BBB
  14. bbb
  15. qq

-b :忽略每行之前的空格,先排数字,字母按顺序(不是把空格删除,只是依然按照数字和字母的顺序排列)

  1. [root@localhost opt]# cat /opt/111.txt
  2. qq
  3. 112
  4. 123
  5. 122
  6. 123
  7. bbb
  8. #忽略空格,先排数字,字母按顺序
  9. [root@localhost opt]# sort -b /opt/111.txt
  10. 112
  11. 122
  12. 123
  13. 123
  14. bbb
  15. qq

-n :按照数字进行排序 字母在前,数字往后排

  1. [root@localhost opt]# sort -n /opt/111.txt
  2. bbb
  3. qq
  4. 112
  5. 122
  6. 123
  7. 123

-r :反向排序

  1. [root@localhost opt]# cat -n /opt/111.txt
  2. 1 qq
  3. 2 112
  4. 3 123
  5. 4 122
  6. 5 123
  7. 6 bbb
  8. 7
  9. #反向输出文本内容
  10. [root@localhost opt]# cat -n /opt/111.txt | sort -r
  11. 7
  12. 6 bbb
  13. 5 123
  14. 4 122
  15. 3 123
  16. 2 112
  17. 1 qq

-u :表示相同的数据只显示1行

  1. [root@localhost opt]# cat 111.txt
  2. qq
  3. 112
  4. 123
  5. 122
  6. 123
  7. qq
  8. [root@localhost opt]# sort -u 111.txt
  9. 112
  10. 122
  11. 123
  12. qq

-o :把排序后的结果转存到指定的文件

[root@localhost opt]# cat -n /etc/passwd | sort -rno /opt/cp.txt

三、uniq

uniq去重 去除连续的重复的行,只显示一行

选项

-c: 统计连续重复的行的次数,合并连续重复的行

  1. [root@localhost opt]# cat 111.txt
  2. qq
  3. 112
  4. BBB
  5. 122
  6. 122
  7. 122
  8. AAA
  9. BBB
  10. BBB
  11. bbb
  12. [root@localhost opt]# uniq -c 111.txt
  13. 1 qq
  14. 1 112
  15. 1 BBB
  16. 3 122
  17. 1 AAA
  18. 2 BBB
  19. 1 bbb

-u:显示仅出现一次的行(包括不是连续出现的重复行)

  1. [root@localhost opt]# cat 111.txt
  2. qq
  3. 112
  4. BBB
  5. 122
  6. 122
  7. 122
  8. AAA
  9. BBB
  10. BBB
  11. bbb
  12. [root@localhost opt]# uniq -u 111.txt
  13. qq
  14. 112
  15. BBB
  16. AAA
  17. bbb

-d :仅显示连续重复的行(不包括非连续出现的内容)

  1. [root@localhost opt]# cat 111.txt
  2. qq
  3. 112
  4. BBB
  5. 122
  6. 122
  7. 122
  8. AAA
  9. BBB
  10. BBB
  11. bbb
  12. [root@localhost opt]# uniq -d 111.txt
  13. 122
  14. BBB

4、tr

tr:用来对标准输出的字符进行替换压缩和删除

格式:tr 选项 参数

-c: 保留字符集1的字符,其他的字符用字符集2进行替换

  1. echo abc | tr -c ''ab 'a'
  2. 输出结果: abaa

-d:删除字符集中的一部分

  1. [root@localhost ~]# echo abc | tr -d 'ab'
  2. c

-s:替换 把字符集1的部分替换成字符集2的部分,连续重复出现的字符压缩成一个字符串

  1. [root@localhost ~]# echo aaabc | tr -s 'a'
  2. abc
  3. [root@localhost ~]# echo $PATH
  4. /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
  5. [root@localhost ~]# echo $PATH | tr -s ':' ';'
  6. /usr/local/sbin;/usr/local/bin;/usr/sbin;/usr/bin;/root/bin

四、cut

cut:快速裁剪 对字段进行采取和裁剪

-d :指定分隔符(默认的分隔符是tab键 不需要使用-d)

-f :对字段进行截取,指定输出段的内容

  1. 裁剪etc/passwd以:分割符的1-31,3截取1行和3
  2. [root@localhost ~]# head -n 1 /etc/passwd | cut -d ':' -f 1-3
  3. root:x:0
  4. [root@localhost ~]# head -n 1 /etc/passwd | cut -d ':' -f 1,3
  5. root:0
  6. [root@localhost ~]# head -n 1 /etc/passwd
  7. root:x:0:0:root:/root:/bin/bash

-b:以字节为单位进行截取

-c :以字符为单位进行截取

-complement :输出的时候排除指定的字段

-output-delimiter:更改输出内容的分隔符

  1. 输出的时候以:分割符的不显示第2
  2. [root@localhost ~]# head -n 1 /etc/passwd | cut -d ':' --complement -f 1
  3. x:0:0:root:/root:/bin/bash
  4. [root@localhost ~]# head -n 1 /etc/passwd | cut -d ':' --output-delimiter='@' -f 1-5
  5. root@x@0@0@root

五、split

split 大文件拆分成若干小的文件

-l :按行来进行分割

[root@localhost opt]# split -l 20 test1.txt 123test1.txt文件 按20进行分割

-b :按照大小来进行分割  

1、cat合并和paste合并有什么区别

cat合并是上下

paste是左右合并

  1. [root@localhost opt]# cat 3.txt
  2. 11111111111111
  3. aaaaa
  4. [root@localhost opt]# paste 1.txt 2.txt > 4.txt
  5. [root@localhost opt]# cat 4.txt
  6. 11111111111111 aaaaa

2、 统计当前主机的连接状态

  1. [root@localhost opt]# ss -antp | grep -v '^State' | cut -d ' ' -f 1 | sort | uniq -c
  2. 2 ESTAB
  3. 15 LISTEN
  4. #grep -v '^State'取反除了以State开头的其他所有
  5. #cut -d ' ' -f 1 以空格为分割符裁剪第一行
  6. # sort 排序
  7. #uniq -c 将连续重复的去重并显示数量

六、正则表达式

正则表达式:由一类特殊字符以及字符所编写的一个模式,模式又来匹配文件当中的内容(字符)

校验我们输入的内容是否满足规定,格式,长度等等要求

主要用来匹配文本内容,命令的结果

通配符:只能用于匹配文件名和目录名,不能匹配文件的内容和命令结果

正则表达式:基本正则表达式

1、元字符(字符匹配)

. 任意单个字符,也可以是一个汉字,每个字符都看一遍

\ :转义符,恢复其本意,使用单引号或者双引号 引起来  

[]:匹配指定范围内的任意单个字符或者数字

[] 中可以匹配多个 例如空格 大小写字母放在一起,每个条件不需要使用空格隔开

在正则表达式中更精确

[^]:取反

'^#' :匹配以#为开头 '^a'以a为开头

^$:表示空行 grep "^$" test1.txt 匹配空行

2、次数匹配

次数匹配:匹配字符出现的次数

*:匹配前面的字符任意次,0次也可以。贪婪模式,尽可能的匹配

.*:匹配前面的任意字符,至少要有1次,匹配所有。

\? :匹配前面的字符0次或者1次,可有可无

\+ :匹配前面的字符,至少出现一次

\ {n\}:匹配前面的字符=n次 可以小于n但不能大于n,而且前面的字符必须连续出现。a \{2\}

\{m,n\}:匹配前面的字符至少m次至多n次,且字符要连续出现,超出的不在匹配范围

\{,n\}:匹配前面的字符最多n次

\{n,\}:匹配前面的字符最少n次

3、位置锚定

^:以什么开头 行首 '^1'以1为开头

$:以什么结尾 行尾 '4$'以4为结尾

'^root$'这一行只能有root

'^$' 空行

\<或者\b 词首锚定,匹配单词的左侧(连续的数字,字母,下划线都算单词内部)

\>或者\b 词尾锚定,用于匹配单词的右侧

hello-123

词首hello\b 或者 hello-\b

词尾\b123 或者\b-123

\broot\b 匹配整个单词root。空格隔开的也算整个单词

与^root$区别:整个一行只有这个单词

4、分组和逻辑关系

分组:()表示分组

或者:\| 逻辑或的意思  

七、 扩展正则表达式

扩展正则表达式:基本正则表达式的选项前的 \ 全部不用

特殊:\b需要加\ 

grep -E + 扩展正则或者egrep不需要+E

实例:打印2.txt文件中的电话号码

[root@localhost test1]# cat 2.txt | grep -E '(\([0-9]+\)|[0-9]+)[ -]?[0-9]+-[0-9]+'

小练习

 1、显示/etc/passwd中以sh结尾的行;

[root@localhost test1]# cat /etc/passwd | grep -E 'sh$'

 2、查找/etc/inittab中含有“以s开头,并以d结尾的单词”模式的行;

[root@localhost test1]# cat /etc/inittab | grep -E '(\bs[a-z]*d\b)'

3、查找ifconfig命令结果中的1-255之间的整数;

[root@localhost /]# ifconfig | grep -E '\b([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\b'

4、在/etc/passwd中取出默认shell为bash的行;

[root@localhost test1]# cat /etc/passwd | grep -E 'bash$'

 5、高亮显示passwd文件中冒号,及其两侧的字符

[root@localhost test1]# cat /etc/passwd | grep -E '.?:*:.'

八、 sed

1、sed文件三剑客之二

sed :是有一种流编辑器,一次处理一行内容

处理方式:如果只是展示,会放在缓冲区(模式空间)展示结束之后,会从模式空间把操作结果删除

处理模式:一行一行处理,处理完当前行,才会处理下一行,直到文件的末尾

sed的命令格式以及操作选项

sed -e '操作选项' -e '操作选项' 文件1 文件2

-e 表示可以跟多个操作符,只有一个操作,-e可以省略

sed -e '操作符1:操作符2' 文件1 文件2

2、选项:

-e:用于执行多个操作命令

-f: 在脚本中定义好了操作符,然后根据脚本内容的操作符对文件进行操作

-i:直接修改目标文件(慎用)

-n:仅显示scrip处理后的结果(不加-n sed会有俩个输出结果,加了-n之后就会把默认的输出屏蔽只显示一个结果)

3、操作符:

p:打印结果

r:使用扩展正则表达式

s:替换,替换字符串

c:替换,替换行

y:替换,替换单个字符,多个字符替换必须和替换内容的长度保存一致

d:删除,删除行

a:增加,在指定行的下一行插入内容

i:增加,在指定行的上一行插入内容

r:在行后增加文件内容(读取其他文件)

$a:在最后一行插入内容

$i:在倒数第二行插入新的内容

$r:读取其他文件的内容然后插入到对象文件的最后一行

4、打印功能

  1. 打印内容
  2. [root@localhost opt]# sed -n 'p' test1.txt
  3. one
  4. two
  5. three
  6. four
  7. five
  8. six
  9. seven
  10. eight
  11. nine
  12. ten

寻址打印

  1. 显示行号
  2. [root@localhost opt]# sed -n '=' test1.txt
  3. 1
  4. 2
  5. 3
  6. 4
  7. 5
  8. 6
  9. 7
  10. 8
  11. 9
  12. 即显示行号,又显示内容
  13. [root@localhost opt]# sed -n '=;p' test1.txt
  14. 1
  15. one
  16. 2
  17. two
  18. 3
  19. three
  20. 4
  21. four
  22. 5
  23. five
  24. 6
  25. six
  26. 7
  27. seven
  28. 8
  29. eight
  30. 9
  31. nine
  32. 10
  33. ten

 指定地址查找

  1. 只显示第4
  2. [root@localhost opt]# sed -n '4p' test1.txt
  3. four

打印最后一行 $p

  1. [root@localhost opt]# sed -n '$p' test1.txt
  2. ten

行号范围打印  

  1. 2行打印到末尾
  2. [root@localhost opt]# sed -n '2,$p' test1.txt
  3. two
  4. three
  5. four
  6. five
  7. six
  8. seven
  9. eight
  10. nine
  11. ten
  12. 打印第二行和第五行
  13. [root@localhost opt]# sed -n '2p;5p' test1.txt
  14. two
  15. five

打印奇数行和偶数行

  1. 奇数
  2. [root@localhost opt]# sed -n 'p;n' test1.txt
  3. one
  4. three
  5. five
  6. seven
  7. nine
  8. 偶数
  9. [root@localhost opt]# sed -n 'n;p' test1.txt
  10. two
  11. four
  12. six
  13. eight
  14. ten
  15. #n的作用,跳过一行打印下一行

5、文本内容进行过滤

  1. 过滤并打印包含o 的行 /所要查找的内容/
  2. [root@localhost opt]# sed -n '/o/p' test1.txt
  3. one
  4. two
  5. four
  6. 过滤并打印包含th的行
  7. [root@localhost opt]# sed -n '/th/p' test1.txt
  8. three

 使用正则表达式对文本内容进行过滤

  1. [root@localhost opt]# sed -n '/^root/p' /etc/passwd
  2. root:x:0:0:root:/root:/bin/bash

从指定行开始,打印到第一个以bash为结尾的行

  1. 从第8行打印到第一个以bash为结尾的行
  2. [root@localhost opt]# sed -n '8,/bash$/p' /etc/passwd

sed可使用的正则表达式 * .* {n,m} {n,}{,m} ? | () +  

  1. 要么以root为开头要么以bash为结尾
  2. [root@localhost opt]# sed -rn '/^root|bash$/p' /etc/passwd
  3. root:x:0:0:root:/root:/bin/bash
  4. test2:x:1000:1000:test2:/home/test2:/bin/bash
  5. dn:x:1001:1001::/home/dn:/bin/bash
  6. zlm:x:1002:1002::/home/zlm:/bin/bash
  7. zdm:x:1003:1003::/home/zdm:/bin/bash
  8. zxc:x:1010:1010::/home/zxc:/bin/bash
  9. qwe:x:1013:1013::/home/qwe:/bin/bash
  10. gfw:x:1014:1014::/home/gfw:/bin/bash
  11. xy102:x:1015:1015::/home/xy102:/bin/bash
  12. zkm:x:1016:1016::/home/zkm:/bin/bash

6、小练习

 如何免交互删除文本内容

sed方式

  1. #-i 进入文本操作
  2. #'d'删除
  3. [root@localhost opt]# sed -i 'd' test1.txt

cat方式

cat /dev/null > test1.txt

7、 sed 的删除操作

删除指定行

  1. 删除第三行,并打印剩下的行
  2. [root@localhost opt]# sed -n '3d;p' test1.txt
  3. one
  4. two
  5. four
  6. five
  7. six
  8. sevend
  9. eight
  10. nine
  11. ten
  12. 除了第三行其他都删除
  13. [root@localhost opt]# sed -n '3!d;p' test1.txt
  14. three
  15. 除了第3行到第6行,其他都删除
  16. [root@localhost opt]# sed -n '3,6!d;p' test1.txt
  17. three
  18. four
  19. five
  20. six

匹配字符串的方式删除行

  1. 删除包含o的行
  2. [root@localhost opt]# sed '/o/d' test1.txt
  3. three
  4. five
  5. six
  6. seven
  7. eight
  8. nine
  9. ten
  10. 删除从one到six的行
  11. [root@localhost opt]# sed '/one/,/six/d' test1.txt
  12. seven
  13. eight
  14. nine
  15. ten

 如何免交互的方式删除空行

  1. [root@localhost opt]# cat test1.txt
  2. one
  3. two
  4. three
  5. four
  6. five
  7. six
  8. seven
  9. eight
  10. nine
  11. ten
  12. [root@localhost opt]# grep -v '^$' test1.txt
  13. one
  14. two
  15. three
  16. four
  17. five
  18. six
  19. seven
  20. eight
  21. nine
  22. ten
  23. [root@localhost opt]# cat test1.txt | tr -s '\n'
  24. one
  25. two
  26. three
  27. four
  28. five
  29. six
  30. seven
  31. eight
  32. nine
  33. ten
  34. [root@localhost opt]# sed '/^$/d' test1.txt
  35. one
  36. two
  37. three
  38. four
  39. five
  40. six
  41. seven
  42. eight
  43. nine
  44. ten

8、主要功能:s替换字符串  

  1. 替换每行第一个root
  2. [root@localhost opt]# sed -n 's/root/test/p' /etc/passwd
  3. test:x:0:0:root:/root:/bin/bash
  4. operator:x:11:0:operator:/test:/sbin/nologin
  5. 替换每行第二个root
  6. [root@localhost opt]# sed -n 's/root/test/2p' /etc/passwd
  7. root:x:0:0:test:/root:/bin/bash
  8. 替换每行所有root
  9. [root@localhost opt]# sed -n 's/root/test/gp' /etc/passwd
  10. test:x:0:0:test:/test:/bin/bash
  11. operator:x:11:0:operator:/test:/sbin/nologin

添加#实现注释功能

  1. 注释所有行
  2. [root@localhost opt]# sed -n 's/^/#/p' test1.txt
  3. #one
  4. #two
  5. #three
  6. #four
  7. #
  8. #
  9. #five
  10. #six
  11. #seven
  12. #eight
  13. #nine
  14. #ten
  15. 注释45
  16. [root@localhost opt]# sed -n '4,5 s/^/#/p' test1.txt
  17. #four
  18. #
  19. 注释47
  20. [root@localhost opt]# sed -n '5 s/^/#/p;7 s/^/#/p' test1.txt
  21. #
  22. #five

首字母变大写  

u& 转换首字母大写的特殊符合,\转义符

  1. 将首字母改为小写
  2. [root@localhost opt]# sed 's/[a-z]/\u&/' test1.txt
  3. One
  4. Two
  5. Three
  6. Four
  7. Five
  8. Six
  9. Seven
  10. Eight
  11. Nine
  12. Ten
  13. 将所有的字母都替换成大写s/[a-z]/\u&/g
  14. [root@localhost opt]# sed 's/[a-z]/\u&/g' test1.txt
  15. ONE
  16. TWO
  17. THREE
  18. FOUR
  19. FIVE
  20. SIX
  21. SEVEN
  22. EIGHT
  23. NINE
  24. TEN

 l&把大写转换成小写的特殊字符,\转义符

  1. [root@localhost opt]# sed 's/[A-Z]/\l&/' test2.txt
  2. aAAA
  3. bB
  4. cC
  5. 所有替换 s/[A-Z]/\l&/g
  6. [root@localhost opt]# sed 's/[A-Z]/\l&/g' test2.txt
  7. aaaa
  8. bb
  9. cc

 整行替换

  1. [root@localhost opt]# sed '/one/c 1' test1.txt
  2. 1
  3. two
  4. three
  5. four
  6. five
  7. six
  8. seven
  9. eight
  10. nine
  11. ten

 9、单个替换

将/etc/sysconfig/network-scripts/ifcfg-ens33 的ip地址修改为192.168.10.100

  1. [root@localhost opt]# sed '/^IP/c IPADDR=192.168.10.100' /etc/sysconfig/network-scripts/ifcfg-ens33
  2. TYPE=Ethernet
  3. DEVICE=ens33
  4. ONBOOT=yes
  5. BOOTPROTO=static
  6. #替换结果
  7. IPADDR=192.168.10.100
  8. NETMASK=255.255.255.0
  9. GATEWAY=192.168.10.2
  10. DNS1=218.2.135.1

y单字符替换  

  1. 将所有的t替换成1 w替换成2 o 替换成3
  2. [root@localhost opt]# sed 'y/two/123/' test1.txt
  3. i 3ne
  4. 123
  5. 1hree
  6. f3ur
  7. five
  8. six
  9. seven
  10. eigh1
  11. nine
  12. 1en

10、 增加功能

  1. #使用a在第3行的下一行插入一个zai
  2. [root@localhost opt]# sed '3a zai' test1.txt
  3. i one
  4. two
  5. three
  6. #新增显示内容
  7. zai
  8. four
  9. five
  10. six
  11. seven
  12. eight
  13. nine
  14. ten
  15. #使用i在第5行的上一行插入一个ba
  16. [root@localhost opt]# sed '5i ba' test1.txt
  17. i one
  18. two
  19. three
  20. four
  21. #新增显示内容
  22. ba
  23. five
  24. six
  25. seven
  26. eight
  27. nine
  28. ten
  29. #使用r将test2.txt的内容插入到test1.txt文件中two的下方
  30. [root@localhost opt]# sed '/two/r test2.txt' test1.txt
  31. i one
  32. two
  33. #新增显示内容
  34. AAAA
  35. BB
  36. CC
  37. three
  38. four
  39. five
  40. six
  41. seven
  42. eight
  43. nine
  44. ten
  45. 使用$a将内容插入在文本内容的最后一行
  46. [root@localhost opt]# sed '$a zai' test1.txt
  47. i one
  48. two
  49. three
  50. four
  51. five
  52. six
  53. seven
  54. eight
  55. nine
  56. ten
  57. #新增显示内容
  58. zai
  59. 使用$i将内容插入在文本内容的倒数第二行
  60. [root@localhost opt]# sed '$i zai' test1.txt
  61. i one
  62. two
  63. three
  64. four
  65. five
  66. six
  67. seven
  68. eight
  69. nine
  70. #新增显示内容
  71. zai
  72. ten
  73. 使用$r将test2.txt的内容插入到test1.txt文件中最后一行
  74. [root@localhost opt]# sed '$r test2.txt' test1.txt
  75. i one
  76. two
  77. three
  78. four
  79. five
  80. six
  81. seven
  82. eight
  83. nine
  84. ten
  85. AAAA
  86. BB
  87. CC

11、 sed进阶部分

使用sed对字符串和字符的位置进行互换

  1. #字符串先进行分组,分组之后进行位置排序
  2. [root@localhost opt]# echo ABC | sed -r 's/(A)(B)(C)/\1\3\2/'
  3. ACB
  4. [root@localhost opt]# echo ABC | sed -r 's/(A)(B)(C)/\3\1\2/'
  5. CAB
  6. [root@localhost opt]# echo ABC | sed -r 's/(A)(B)(C)/\2\1\3/'
  7. BAC
  8. [root@localhost opt]# echo zhangxiaoming | sed -r 's/(zhang)(xiao)(ming)/\3\1\2/'
  9. mingzhangxiao
  10. 对字符位置进行互换,先分组,使用.代替字符,也可以直接使用原字符,然后再进行排序
  11. [root@localhost opt]# echo 猪小明 | sed -r 's/(.)(.)(.)/\3\2\1/'
  12. 明小猪

取出.jar之前的版本号 

  1. [root@localhost opt]# cat test3.txt
  2. ant-1.9.7.jar
  3. ant-launcher-1.9.7.jar
  4. antlr-2.7.7.jar
  5. antlr-runtime-3.4.jar
  6. aopalliance-1.0.jar
  7. archaius-core-0.7.6.jar
  8. asm-5.0.4.jar
  9. aspectjweaver-1.9.5.jar
  10. bcpkix-jdk15on-1.64.jar
  11. bcprov-jdk15-1.46.jar
  12. bcprov-jdk15on-1.64.jar
  13. checker-compat-qual-2.5.5.jar
  14. [root@localhost opt]# cat test3.txt | grep -E '[0-9]+\.'

使用grep命令 

 使用sed命令

  1. #先进行分组,分成3个组 .*代表任意长度的字符串 版本号位于第二组 取出第2组即可
  2. [root@localhost opt]# cat test1.txt | sed -r 's/(.*)-(.*)(.jar)/\2/' test3.txt
  3. 1.9.7
  4. 1.9.7
  5. 2.7.7
  6. 3.4
  7. 1.0
  8. 0.7.6
  9. 5.0.4
  10. 1.9.5
  11. 1.64
  12. 1.46
  13. 1.64
  14. 2.5.5

12、 打印指定时间内的日志

[root@localhost opt]# sed -n '/Jun 21 13:50:01/,/Jun 21 14:01:01/p' /var/log/messages

13、使用脚本的形式结合sed命令,把pxe自动装机做一个shell脚本

  1. #关闭防火墙以及安全机制
  2. systemctl stop firewalld
  3. setenforce 0
  4. #安装TFTP,xinetd服务,并将服务启动
  5. yum -y install tftp-server xinetd
  6. systemctl start tftp
  7. systemctl enable tftp
  8. systemctl start xinetd.service
  9. systemctl enable xinetd.service
  10. #vim /etc/xinetd.d/tftp`管理tftp服务配置
  11. sed -i 's/yes/no/g' /etc/xinetd.d/tftp
  12. #编辑文本内容
  13. #wait = no
  14. #修改成 no :可以并行安装多台客户机
  15. #disable = no
  16. #修改成 no: 后台启动tftp
  17. 重启两个服务
  18. systemctl restart tftp
  19. systemctl restart xinetd
  20. 配置DHCP
  21. 先安装`dhcp`服务
  22. yum -y install dhcp
  23. 对`dhcp`服务进行配置:复制`dhcp`样板配置文件,覆盖`dhcp`实际的配置文件
  24. yes | cp /usr/share/doc/dhcp-4.2.5/dhcpd.conf.example /etc/dhcp/dhcpd.conf
  25. sed -i 's/#ddns-update-style none;/ddns-update-style none;/' /etc/dhcp/dhcpd.conf
  26. sed -i '15a next-server 192.168.10.20;' /etc/dhcp/dhcpd.conf
  27. sed -i '16a filename "pxelinux.0";' /etc/dhcp/dhcpd.conf
  28. sed -i 's/subnet 10.254.239.0 netmask 255.255.255.224 {/ subnet 192.168.10.0 netmask 255.255.255.0 {/' /etc/dhcp/dhcpd.conf
  29. sed -i 's/range 10.254.239.10 10.254.239.20;/range 192.168.10.100 192.168.10.110;/' /etc/dhcp/dhcpd.conf
  30. sed -i 's/rtr-239-0-1.example.org, rtr-239-0-2.example.org;/192.168.10.20;/' /etc/dhcp/dhcpd.conf
  31. systemctl restart dhcpd
  32. #挂载光盘
  33. mount /dev/cdrom /mnt/
  34. cp /mnt/images/pxeboot/initrd.img /var/lib/tftpboot/
  35. cp /mnt/images/pxeboot/vmlinuz /var/lib/tftpboot/
  36. yum -y install syslinux
  37. cp /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot/
  38. yum -y install vsftpd
  39. mkdir /var/ftp/centos7
  40. cp -rf /mnt/* /var/ftp/centos7
  41. systemctl restart vsftpd
  42. mkdir /var/lib/tftpboot/pxelinux.cfg
  43. cat > /var/lib/tftpboot/pxelinux.cfg/default <<EOF
  44. default auto
  45. prompt 0
  46. label auto
  47. kernel vmlinuz
  48. append initrd=initrd.img method=ftp://192.168.10.20/centos7 ks=ftp://192.168.10.20/ks.cfg
  49. label linux text
  50. kernel vmlinuz
  51. append initrd=initrd.img method=ftp://192.168.10.20/centos7
  52. label linux rescue
  53. kernel vmlinuz
  54. append initrd=initrd.img method=ftp://192.168.10.20/centos7
  55. EOF
  56. #无人值守部分
  57. yum -y install system-config-kickstart
  58. cat > /var/ftp/ks.cfg <<EOF
  59. #platform=x86, AMD64, or Intel EM64T
  60. #version=DEVEL
  61. install
  62. keyboard 'us'
  63. url --url="ftp://192.168.10.20/centos7"
  64. lang zh_CN
  65. auth --useshadow --passalgo=sha512
  66. graphical
  67. firstboot --disable
  68. selinux --disabled
  69. firewall --disabled
  70. network --bootproto=dhcp --device=ens33
  71. reboot
  72. timezone Asia/Shanghai
  73. bootloader --location=mbr
  74. zerombr
  75. clearpart --all --initlabel
  76. part /boot --fstype="xfs" --size=512
  77. part /home --fstype="xfs" --size=4096
  78. part swap --fstype="swap" --size=4096
  79. part / --fstype="xfs" --grow --size=1
  80. %packages
  81. @base
  82. @core
  83. @desktop-debugging
  84. @dial-up
  85. @directory-client
  86. @fonts
  87. @gnome-desktop
  88. @guest-desktop-agents
  89. @input-methods
  90. @internet-browser
  91. @java-platform
  92. @multimedia
  93. @network-file-system-client
  94. @print-client
  95. @x11
  96. binutils
  97. chrony
  98. ftp
  99. gcc
  100. kernel-devel
  101. kexec-tools
  102. make
  103. open-vm-tools
  104. patch
  105. python
  106. %end
  107. EOF

九、awk

文件三剑客最后一个awk

wk :按行取列

awk默认分割符:空格,tab键,多个空格自动压缩成一个。

awk的工作原理,根据指令信息,逐行的读取文本内容,然后按照条件进行格式化输出。

1、awk的选项:

-F :指定分隔符,默认就是空格

-v :变量赋值

2、内置变量:

$#:(#表示数字) 按行需要取出的第几个字段

$0:打印所有,展示所有的文本内容(默认)

NR:需要处理的行号

NF:处理行的字段个数,特殊的$NF表示当前行的最后一个字段(几个字段)

FS:FS和F是一样的,都是指定分隔符,-F:FS=":"

OFS:指定输出内容的分隔符

RS:行分割符,可以根据RS的设置把文件内容切割成多个记录,也可以改变行的分隔符,默认是\n,回车,换行。

格式:

awk -F ‘操作符(动作)’处理对象

-F指定分隔符,如果是空格可以不加 动作:默认就是打印

  1. [root@localhost opt]# awk '{print}' awk.txt #print后没加东西,默认$0
  2. one two three
  3. four five six
  4. eight nine ten
  5. [root@localhost opt]# awk '{print NR}' awk.txt #仅打印行号
  6. 1
  7. 2
  8. 3
  9. 4
  10. [root@localhost opt]# awk '{print NR,$0}' awk.txt #不仅打印行号,也显示内容
  11. 1 one two three
  12. 2 four five six
  13. 3 eight nine ten
  14. 4

打印指定行

  1. [root@localhost opt]# awk 'NR==2{print}' awk.txt #打印指定的第2
  2. four five six
  3. [root@localhost opt]# awk 'NR==2,NR==5{print}' awk.txt #打印25
  4. four five six
  5. eight nine ten
  6. a b c
  7. d e f
  8. [root@localhost opt]# awk 'NR==2;NR==5{print}' awk.txt #打印第2和第5
  9. four five six
  10. d e f
  11. [root@localhost opt]# awk 'NR%2==0{print}' awk.txt #打印偶数行
  12. four five six
  13. a b c
  14. g h i
  15. m i n
  16. [root@localhost opt]# awk 'NR%2==1{print}' awk.txt #打印奇数行
  17. one two three
  18. eight nine ten
  19. d e f
  20. j k l

指定分隔符 -F+要分割符  

  1. #以:为分割符,查找13行的第3
  2. [root@localhost opt]# awk -F: 'NR==1,NR==3{print $3}' /etc/passwd
  3. 0
  4. 1
  5. 2
  6. #打印第2行和第3行的第1
  7. [root@localhost opt]# awk -F: 'NR==2{print $1};NR==3{print $1}' /etc/passwd
  8. bin
  9. daemon

3、awk怎么使用文本过滤

  1. #过滤root,也可以使用正则表达式
  2. [root@localhost opt]# awk '/root/{print}' /etc/passwd
  3. root:x:0:0:root:/root:/bin/bash
  4. operator:x:11:0:operator:/root:/sbin/nologin
  5. #正则表达式
  6. [root@localhost opt]# awk '/bash$/{print}' /etc/passwd
  7. root:x:0:0:root:/root:/bin/bash
  8. test2:x:1000:1000:test2:/home/test2:/bin/bash
  9. dn:x:1001:1001::/home/dn:/bin/bash
  10. zlm:x:1002:1002::/home/zlm:/bin/bash
  11. zdm:x:1003:1003::/home/zdm:/bin/bash
  12. xy102:x:1004:1004::/home/xy102:/bin/bash
  13. zzz:x:1006:1005::/home/zzz:/bin/bash
  14. zxc:x:1010:1010::/home/zxc:/bin/bash
  15. qqq:x:1011:1011::/home/qqq:/bin/bash

4、BEGIN模式进行打印

格式:awk 'BEGIN{...};{...};END{...}' 文件

BEGIN{...}表示预先的条件,执行awk命令前的初始化操作

第二个{...}处理条件,如何对初始值进行操作

END{...}处理完之后的操作,一般都是打印

  1. #BEGIN与END连用
  2. 有初始条件
  3. [root@localhost opt]# awk 'BEGIN{x=1};{x++};END{print x}' awk.txt
  4. 9
  5. #统计行数
  6. [root@localhost opt]# awk 'BEGIN{x=0};{x++};END{print x}' awk.txt
  7. 8
  8. #单独使用BEGIN,一次性执行,不需要处理条件
  9. #乘法
  10. [root@localhost opt]# awk 'BEGIN{print 10*2}' awk.txt
  11. 20
  12. #幂运算
  13. [root@localhost opt]# awk 'BEGIN{print 2**3}' awk.txt
  14. 8
  15. #次方
  16. [root@localhost opt]# awk 'BEGIN{print 2^3}' awk.txt
  17. 8

5、变量赋值

将外面的a的值传到awk里面进行赋值加一个 -v

  1. read -p "输入第一个数" num1
  2. read -p "输入第二个数" num2
  3. sum=$(awk -v num1="$num1" -v num2="$num2" 'BEGIN{print num1^num2}')
  4. echo $sum

结果  

  1. [root@localhost opt]# sh awk.sh
  2. 输入第一个数2
  3. 输入第二个数3
  4. 8

6、不常用选项,了解  

  1. 使用OFSS将:换成==
  2. [root@localhost opt]# awk -v FS=":" -v OFS="==" '{print $1,$3}' /etc/passwd
  3. root==0
  4. bin==1
  5. daemon==2
  6. adm==3

7、 使用awk 进行条件判断打印

  1. 打印第三列大于999打印所有
  2. [root@localhost opt]# awk -F: '$3>999{print $0}' /etc/passwd
  3. nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
  4. test2:x:1000:1000:test2:/home/test2:/bin/bash
  5. dn:x:1001:1001::/home/dn:/bin/bash
  6. zlm:x:1002:1002::/home/zlm:/bin/bash
  7. zdm:x:1003:1003::/home/zdm:/bin/bash
  8. xy102:x:1004:1004::/home/xy102:/bin/bash
  9. zzz:x:1006:1005::/home/zzz:/bin/bash
  10. zxc:x:1010:1010::/home/zxc:/bin/bash
  11. qqq:x:1011:1011::/home/qqq:/bin/bash
  12. nginx:x:1012:1012::/home/nginx:/sbin/nologin
  13. 条件判断第三列等于1000,并打印所有
  14. [root@localhost opt]# awk -F: '($3==1000){print $0}' /etc/passwd
  15. test2:x:1000:1000:test2:/home/test2:/bin/bash

8、awk的三元表达式

if else 语句  

格式:awk -F: 'num=($3>$4)? $3:$4;'

  1. 转换成if语句
  2. ?=if
  3. :=else
  4. ;=fi
  5. if$3>$4
  6. then
  7. echo $3
  8. else
  9. echo $4
  10. fi

9、 awk的精确筛选:

$n(<>==)用于比较数值

$n~"字符串" 表示该字段包含某个字符串

$n!~"字符串" 该字段不包含某个字符串

$n=="字符串" 该字段等于这个字符串

$n!="字符串" 该字段不等于这个字符串

$NF 代表最后一个字段

  1. #打印第7列包含bash这个字段的行,取得是行的第一列和最后一列,以:作为分隔符
  2. [root@localhost opt]# awk -F: '$7~"bash" {print $1,$NF}' /etc/passwd
  3. #取出第1列,第2列,和第3列,没有范围表示的,只有什么和什么
  4. [root@localhost opt]# awk -F: '$7~"bash" {print $1,$2,$3}' /etc/passwd
  5. root x 0
  6. test2 x 1000
  7. dn x 1001
  8. zlm x 1002
  9. zdm x 1003
  10. xy102 x 1004
  11. zzz x 1006
  12. zxc x 1010
  13. qqq x 1011
  14. #精确匹配带有/bin/bash的字符串,==后面跟着的必须是完整的字符串,错一个字符也不能匹配到
  15. [root@localhost opt]# awk -F: '$7=="/bin/bash" {print $1,$2,$3}' /etc/passwd
  16. root x 0
  17. test2 x 1000
  18. dn x 1001
  19. zlm x 1002
  20. zdm x 1003
  21. xy102 x 1004
  22. zzz x 1006
  23. zxc x 1010
  24. qqq x 1011

10、逻辑关系  

且和或

第一列等于dn且第七列等于/bin/bash

  1. 逻辑且 $1=="dn"可以使用()括起来
  2. [root@localhost opt]# awk -F: '$1=="dn" && $7=="/bin/bash" {print $1,$7}' /etc/passwd
  3. dn /bin/bash
  4. 逻辑或
  5. [root@localhost opt]# awk -F: '$1=="dn" || $7=="/bin/bash" {print $1,$7}' /etc/passwd
  6. root /bin/bash
  7. test2 /bin/bash
  8. dn /bin/bash
  9. zlm /bin/bash
  10. zdm /bin/bash
  11. xy102 /bin/bash
  12. zzz /bin/bash
  13. zxc /bin/bash
  14. qqq /bin/bash

11、curl

curl是一个功能强大的命令

获取和发送数据

curl 域名/ip地址 获取网页的内容并且输出

curl www.baidu.com

curl 192.168.10.20

-O 下载文件到本地

-o 将文件下载到指定的路径

-x 发生post请求

-i 可以获取web软件的版本(服务端没有隐藏)

按行取列盘,不包含那个行的处理

12、小练习

awk取小数点几位以及小数运算怎么取整数  

  1. num=$(awk 'BEGIN{printf "%.2f",1.222*1.222}')
  2. 取小数点后两位,但是会四舍五入
  3. [root@localhost nginx]# echo $num
  4. 1.49
  5. 只取整数部分
  6. [root@localhost nginx]# num=$(awk 'BEGIN{printf "%.F",1.222+1.222}')
  7. [root@localhost nginx]# echo $num
  8. 2

 连续取出test1.txt文件中的域名部分

  1. [root@localhost opt]# cat test1.txt
  2. 1 www.kgc.com
  3. 2 mail.kgc.com
  4. 3 ftp.kgc.com
  5. 4 linux.kgc.com
  6. 5 blog.kgc.co
  7. 主机名取出来
  8. [root@localhost opt]# cat test1.txt | awk -F '[ .]+' '{print $2}'
  9. www
  10. mail
  11. ftp
  12. linux
  13. blog

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/黑客灵魂/article/detail/781533
推荐阅读
相关标签
  

闽ICP备14008679号