翼度科技»论坛 云主机 LINUX 查看内容

Linux三剑客grep、sed、awk(包括练习题)

8

主题

8

帖子

24

积分

新手上路

Rank: 1

积分
24
Linux grep、sed、awk(包含练习题)

一、grep

Linux grep (global regular expression) 命令用于查找文件里符合条件的字符串或正则表达式。

  • 基本用法与常见的正则表达式
  1. grep [options] pattern [files]
  2. 命令         参数           匹配模式        文件数据
  3.         -i:忽略大小写进行匹配。
  4.         -v:反向查找,只打印不匹配的行。
  5.         -n:显示匹配行的行号。
  6.         -E 或 --extended-regexp : 将样式为延伸的正则表达式来使用。
  7.         -q 或 --quiet或--silent : 不显示任何信息。
  8.         -o 或 --only-matching : 只显示匹配PATTERN 部分。
  9. `找到mysql有关的行并显示行号`
  10. [root@localhost /]# grep "mysql" /tmp/passwd.txt -n
  11. 49:mysql:x:27:27:MariaDB Server:/var/lib/mysql:/sbin/nologin
  12. `找到MYSQL有关的行不区分大小写`
  13. [root@localhost /]# grep "MYSQL" /tmp/passwd.txt -i
  14. 49:mysql:x:27:27:MariaDB Server:/var/lib/mysql:/sbin/nologin
  15. `找到不是mysql有关的行`
  16. [root@localhost /]# grep  "mysql" /tmp/passwd.txt -v
  17. root:x:0:0:root:/root:/bin/bash
  18. bin:x:1:1:bin:/bin:/sbin/nologin
  19. daemon:x:2:2:daemon:/sbin:/sbin/nologin
  20. `统计还有root行的行数`
  21. [root@localhost /]# grep  "root" /tmp/passwd.txt -c
  22. 2
  23. ---^符号 锚定行的开始 如:'^grep'匹配所有以grep开头的行
  24. `^ 以什么开头`
  25. `找到m开头的行 不区分大小写`
  26. [root@localhost /]# grep  '^m' /tmp/luffy.txt -i
  27. My qq is 877348180.
  28. My name is chaoge.
  29. ---$符号 锚定行的结束 如:'grep$'匹配所有以grep结尾的行
  30. `$ 以什么开结尾`
  31. [root@localhost /]# grep  'oldboy$' /tmp/luffy.txt -i
  32. I am oldboy
  33. `找到luffy.txt文件中的空行   '^$'以空开头 以空结尾`
  34. [root@localhost /]# grep  '^$' /tmp/luffy.txt -n
  35. 3:
  36. 5:
  37. `找到luffy.txt文件中的非空行`
  38. [root@localhost /]# grep  '^$' /tmp/luffy.txt -v
  39. I am oldboy
  40. I like linux.
  41. My name is xuxuxu
  42. #Our school website is http://xixixi.com
  43. `找到luffy.txt文件中的非空非注释行`
  44. [root@localhost /]# grep  '^$|^#' /tmp/luffy.txt -Ev
  45. I am oldboy
  46. I teach linux.
  47. I like python.
  48. My qq is 877348180.
  49. My name is chaoge.
  50. ---.符号 表示任意一个字符,有且只有一个,不包含空行
  51. `"."点表示任意一个字符,有且只有一个,不包含空行`
  52. '匹配出".ac",找出任意一个两位字符,包含s'
  53. [root@localhost /]# grep  '.s' /tmp/luffy.txt
  54. My qq is 877348180.
  55. My name is chaoge.
  56. Our school website is http:/loldboyedu.com
  57. `找到以.结尾的行 直接写.$会被当做任意字符 用\进行转义`
  58. [root@localhost /]# grep  '\.$' /tmp/luffy.txt -i
  59. I teach linux.
  60. I like python.
  61. My qq is 877348180.
  62. My name is chaoge.
  63. [root@localhost /]# grep  '/bin/bash$' /tmp/passwd.txt -n
  64. 1:root:x:0:0:root:/root:/bin/bash
  65. 44:test:x:1000:1000:test:/home/test:/bin/bash
  66. 45:xiaosang:x:1001:1001::/home/xiaosang:/bin/bash
  67. 46:biaosang:x:1002:1002::/home/biaosang:/bin/bash
  68. `找到passwd.txt文件中以/bin/bash结尾的行,且只显示找到的/bin/bash本身`
  69. [root@localhost /]# grep  '/bin/bash$' /tmp/passwd.txt -n -o
  70. 1:/bin/bash
  71. 44:/bin/bash
  72. 45:/bin/bash
  73. 46:/bin/bash
  74. ---*符号 匹配零个或多个先前字符如:'*grep'匹配所有一个或多个空格后紧跟grep的行
  75. [root@localhost /]# grep  'boy*' /tmp/luffy.txt
  76. I am oldboy
  77. #Our school website is http:/loldboyedu.com
  78. `贪婪匹配`
  79. [root@localhost /]# grep  '.*e' /tmp/luffy.txt  -o
  80. I te
  81. I like
  82. My name is chaoge
  83. Our school website is http:/loldboye
  84. ---[]符号 匹配一个指定范围内的字符,如'[Gg]rep'匹配Grep和grep
  85. [root@localhost /]# grep [ib]s /tmp/luffy.txt
  86. My qq is 877348180.
  87. My name is chaoge.
  88. Our school website is http:/loldboyedu.com
  89. [root@localhost /]# grep [a-z] /tmp/luffy.txt
  90. I am oldboy
  91. I teach linux.
  92. I like python.
  93. My qq is 877348180.
  94. My name is chaoge.
  95. Our school website is http:/loldboyedu.com
  96. ---[^]符号 匹配一个不在指定范围内的字符,如:'[^A-FH-Z]rep'匹配不包含A-R和T-Z的一个字母开头,紧跟rep的行
复制代码

  • 扩展正则表达式实践
    此处使用grep -E 进行实践扩展正则,egrep官网已经弃用
  1. +符号
  2. `+号表示匹配前一个字符1次或多次,必须使用grep -E 扩展正则`
  3. [root@localhost /]# grep  'l+' /tmp/luffy.txt -E
  4. I am oldboy
  5. I teach linux.
  6. I like python.
  7. Our school website is http:/loldboyedu.com
  8. ?符号
  9. `匹配前一个字符0次或1次`
  10. `找到文件中包含gd或god的行`
  11. [root@localhost /]# grep 'go?d' /tmp/test.txt -E
  12. gd
  13. god
  14. |符号 在正则中表示或者的意思
  15. `找到/tmp中txt文件,且名字里包含a或b的字符`
  16. [root@localhost /]# find /tmp -name "*.txt" | grep -E "a|b"
  17. /tmp/passwd.txt
  18. /tmp/my_crontab.txt
  19. ()符号
  20. `将一个或多个字符捆绑在一起,当作一个整体进行处理`
  21. [root@localhost /]# grep -E 'g(oo|al)d' /tmp/test.txt
  22. good
  23. gald
  24. a{n,m}匹配a的次数
  25. `重复前一个字符各种次数,可以通过-o参数显示明确的匹配过程`
  26. [root@localhost /]# grep -E "x{2,4}" /tmp/xuxu.txt
  27. xxxxxxxuuuuuu
  28. xxxxuuuu
  29. xxuu
  30. [root@localhost /]# grep -E "x{2,4}" /tmp/xuxu.txt -o
  31. xxxx
  32. xxx
  33. xxxx
  34. xx
  35. `最多匹配4次`
  36. [root@localhost /]# grep -E "x{,4}" /tmp/xuxu.txt
  37. xxxxxxxuuuuuu
  38. xxxxuuuu
  39. xu
  40. xxuu
  41. `最少匹配4次`
  42. [root@localhost /]# grep -E "x{4,}" /tmp/xuxu.txt
  43. xxxxxxxuuuuuu
  44. xxxxuuuu
复制代码
二、sed

注意:sed和awk使用单引号,双引号有特殊解释
sed是Stream Editor(字符流编辑器)的缩写,简称流编辑器
sed是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”,接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。

  • 基本语法
  1. sed [options] '{command}[flags]' filename   
  2.         命令选项        内部选项和参数                文件
  3. 命令选项
  4. -e script 将脚本中指定的命令添加到处理输入时执行的命令中,  多条件,一行中要有多个操作
  5. -f script 将文件中指定的命令添加到处理输入时执行的命令中
  6. -n                 仅显示script处理后的结果
  7. -i        编辑文件内容
  8. -i.bak    修改时同时创建.bak备份文件。
  9. -r        使用扩展的正则表达式
  10. !         取反 (跟在模式条件后与shell有所区别)
  11. sed常用内部命令
  12. a   在匹配后面添加
  13. i   在匹配前面添加
  14. p   打印
  15. d   删除
  16. s   查找替换
  17. c   更改
  18. y   转换   N D P
  19. flags
  20. 数字             表示新文本替换的模式
  21. g:             表示用新文本替换现有文本的全部实例
  22. p:             表示打印原始的内容
  23. w filename:     将替换的结果写入文件
  24. 空地址 全文匹配
  25. 单地址 指定文件某一行
  26. /pattern/        被模式匹配的每一行
  27. 范围区间         10,20 十到二十行 10,+5第10行向下5行,/pattern1/,/pattern2/
  28. 步长        1~2,表示1,3,5,7,9行,2~2表示2,4,6,8,10偶数行
复制代码

  • 基本用法
  1. `打印第2、3行`
  2. [root@localhost /]# sed "2,3p" /tmp/luffy.txt -n
  3. I teach linux.
  4. I like python.
  5. `打印第一行和下面3行`
  6. [root@localhost /]# sed "1,+3p" /tmp/luffy.txt -n
  7. I am oldboy
  8. I teach linux.
  9. I like python.
  10. I like linux.
  11. `找出有linux的行并打印`
  12. [root@localhost /]# sed "/linux/p" /tmp/luffy.txt -n
  13. I teach linux.
  14. I like linux.
  15. `删除第5行至末尾行的内容`
  16. [root@localhost ~]# sed '5,$d' /tmp/luffy2.txt -i
  17. `s///替换 g表示全局替换`
  18. [root@localhost ~]# sed 's/linux/java/g' /tmp/luffy2.txt -i
  19. [root@localhost ~]# cat /tmp/luffy2.txt
  20. I teach java.
  21. I like python.
  22. `多次替换`
  23. [root@localhost ~]# sed -e 's/java/linux/g' -e 's/python/c++/g' /tmp/luffy2.txt -i
  24. [root@localhost ~]# cat /tmp/luffy2.txt
  25. I teach linux.
  26. I like c++.
  27. `在文件第二行后追加一行`
  28. [root@localhost ~]# sed '2a good good study' /tmp/luffy2.txt -i
  29. [root@localhost ~]# cat /tmp/luffy2.txt
  30. I teach linux.
  31. I like c++.
  32. good good study
  33. `在第三行前插入一行`
  34. [root@localhost ~]# sed '3i happy every day' /tmp/luffy2.txt -i
  35. [root@localhost ~]# cat /tmp/luffy2.txt
  36. I teach linux.
  37. I like c++.
  38. happy every day
  39. good good study
  40. `在每一行加上分隔符`
  41. [root@localhost ~]# sed 'a -------------' /tmp/luffy2.txt -i
  42. [root@localhost ~]# cat /tmp/luffy2.txt
  43. I teach linux.
  44. -------------
  45. I like c++.
  46. -------------
  47. happy every day
  48. -------------
  49. good good study
  50. -------------
  51. -------------
  52. -------------
  53. `双斜线正则匹配 配合d删除`
  54. [root@localhost ~]# sed -e '/^$/d' -e '/^#/d' /tmp/luffy2.txt
  55. I teach linux.
  56. I like c++.
  57. happy every day
  58. good good study
  59. [root@localhost ~]# sed  '/^$/d;/^#/d' /tmp/luffy2.txt
  60. I teach linux.
  61. I like c++.
  62. happy every day
  63. good good study
  64. `取出linux的ip地址`  
  65. [root@localhost ~]#  ifconfig ens33 | sed '2p' -n | sed 's/^.*inet//' | sed 's/net.*$//'
  66. 192.168.70.14  
  67. [root@localhost ~]# ifconfig ens33 | sed -e "2s/^.*inet//" -n  -e "2s/net.*$//p"
  68. 192.168.70.14  
复制代码
三、awk

AWK 是一种处理文本文件的语言,是一个强大的文本分析工具。
之所以叫 AWK 是因为其取了三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的 Family Name 的首字符。
1,主要的作用:
用来处理文本,将文本按照指定的格式输出。其中包含了变量,循环以及数组。
2,语法
awk [option] 'pattern[action]' file ...
awk 参数          ‘条件动作’                 文件
Action指的是动作,awk擅长文本格式化,且输出格式化后的结果,因此最常用的动作就是print 和 printf
3,   action动作场景

  • $0表示整行
  • $NF表示当前分割后的最后一列
  • 倒数第二列可以写成$(NF-1)
  1. `打印所有列`
  2. [root@localhost ~]# awk '{print $0}' /tmp/awktest.txt
  3. xux1 xux2 xux3 xux4 xux5
  4. xux6 xux7 xux8 xux9 xux10
  5. xux11 xux12 xux13 xux14 xux15
  6. xux16 xux17 xux18 xux19 xux20
  7. xux21 xux22 xux23 xux24 xux25
  8. xux26 xux27 xux28 xux29 xux30
  9. xux31 xux32 xux33 xux34 xux35
  10. xux36 xux37 xux38 xux39 xux40
  11. xux41 xux42 xux43 xux44 xux45
  12. xux46 xux47 xux48 xux49 xux50
  13. `打印第一列`
  14. [root@localhost ~]# awk '{print $1}' /tmp/awktest.txt
  15. xux1
  16. xux6
  17. xux11
  18. xux16
  19. xux21
  20. xux26
  21. xux31
  22. xux36
  23. xux41
  24. xux46
复制代码
4,内置变量
NR                  表示当前文件的行数
NF                  表示当前文件有几列
FS                  表示当前的列分隔符
RS                  表示当前的行分隔符
OFS            输出字段分隔符
ORS            输出记录分隔符
  1. [root@localhost ~]# awk 'NR==5{print $0}' /tmp/awktest.txt
  2. xux21 xux22 xux23 xux24 xux25
  3. [root@localhost ~]# awk 'NR==5, NR ==6{print $0}' /tmp/awktest.txt
  4. xux21 xux22 xux23 xux24 xux25
  5. xux26 xux27 xux28 xux29 xux30
  6. `打印第1-3行所有列`
  7. [root@localhost ~]# awk 'NR==1,NR ==3{print $0}' /tmp/awktest.txt
  8. xux1 xux2 xux3 xux4 xux5
  9. xux6 xux7 xux8 xux9 xux10
  10. xux11 xux12 xux13 xux14 xux15
  11. `打印行号NR`
  12. [root@localhost ~]# awk '{print NR,$0}' /tmp/awktest.txt
  13. 1 xux1 xux2 xux3 xux4 xux5
  14. 2 xux6 xux7 xux8 xux9 xux10
  15. 3 xux11 xux12 xux13 xux14 xux15
  16. 4 xux16 xux17 xux18 xux19 xux20
  17. 5 xux21 xux22 xux23 xux24 xux25
  18. 6 xux26 xux27 xux28 xux29 xux30
  19. 7 xux31 xux32 xux33 xux34 xux35
  20. 8 xux36 xux37 xux38 xux39 xux40
  21. 9 xux41 xux42 xux43 xux44 xux45
  22. 10 xux46 xux47 xux48 xux49 xux50
  23. [root@localhost ~]# awk '{print $(NF-2),$(NF-1),$NF}' /tmp/awktest.txt
  24. xux3 xux4 xux5
  25. xux8 xux9 xux10
  26. xux13 xux14 xux15
  27. xux18 xux19 xux20
  28. xux23 xux24 xux25
  29. xux28 xux29 xux30
  30. xux33 xux34 xux35
  31. xux38 xux39 xux40
  32. xux43 xux44 xux45
  33. xux48 xux49 xux50
  34. `ip地址`
  35. [root@localhost ~]# ifconfig ens33 | awk 'NR==2{print $2}'
  36. 192.168.70.14
复制代码
5,   自定义输出
​        注意:awk,必须 外层单引号,内层双引号
​        内置变量 $1、$2 都不得添加双引号,否则会识别为文本,尽量别加引号
  1. `使用逗号默认空格分隔`
  2. [root@localhost ~]#  awk '{print $1,$3,$5}' /tmp/awktest.txt  
  3. xux1 xux3 xux5
  4. xux6 xux8 xux10
  5. xux11 xux13 xux15
  6. xux16 xux18 xux20
  7. xux21 xux23 xux25
  8. xux26 xux28 xux30
  9. xux31 xux33 xux35
  10. xux36 xux38 xux40
  11. xux41 xux43 xux45
  12. xux46 xux48 xux50
  13. [root@localhost ~]#  awk '{print "n1: "$1,"n2: "$3,"n3: "$5}' /tmp/awktest.txt
  14. n1: xux1 n2: xux3 n3: xux5
  15. n1: xux6 n2: xux8 n3: xux10
  16. n1: xux11 n2: xux13 n3: xux15
  17. n1: xux16 n2: xux18 n3: xux20
  18. n1: xux21 n2: xux23 n3: xux25
  19. n1: xux26 n2: xux28 n3: xux30
  20. n1: xux31 n2: xux33 n3: xux35
  21. n1: xux36 n2: xux38 n3: xux40
  22. n1: xux41 n2: xux43 n3: xux45
  23. n1: xux46 n2: xux48 n3: xux50
复制代码
6,   功能性参数
-F 指定分割字段符
-v 定义或修改一个awk内部的变量
-f 从脚本文件中读取awk命令
输入分隔符,awk默认是空格,空白字符,英文是field separator,变量名是FS
输出分隔符,output field separator,简称0FS
awk模式
关系运算符含义用法示例</tdtd小于/tdtdx < y/td/trtrtd=/tdtd小于等于/tdtdx = y/td/trtrtd==/tdtd等于/tdtdx == y/td/trtrtd!=/tdtd不等于/tdtdx != y/td/trtrtd=/tdtd大于等于/tdtdx = y/td/trtrtd>大于x > y~与对应的正则匹配则为真x ~ /正则/!~与对应的正则不匹配则为真x !~ /正则/
  1. `-F 自定义输入分隔符`
  2. [root@localhost ~]# awk -F ":"  'NR==1{print $0}' /tmp/passwd.txt
  3. root:x:0:0:root:/root:/bin/bash
  4. [root@localhost ~]# awk -F ":"  'NR==1{print $1}' /tmp/passwd.txt
  5. root
  6. `还可以用 FS 搭配-v 使用 改变输入分隔符`
  7. [root@localhost ~]# awk -v FS=":" 'NR==1{print $1}' /tmp/passwd.txt
  8. root
  9. `使用单个逗号 输出分隔符默认是空格`
  10. [root@localhost ~]# awk -F":" 'NR==1{print $1,$NF}' /tmp/passwd.txt
  11. root /bin/bash
  12. `自定义输出分割符号`
  13. [root@localhost ~]# awk -F":" 'NR==1{print $1,"----------",$NF}' /tmp/passwd.txt
  14. root ---------- /bin/bash  
  15. `OFS 修改默认输出分隔符`
  16. [root@localhost ~]# awk -F":" -v OFS="---------" 'NR==1{print $1,$NF}' /tmp/passwd.txt
  17. root---------/bin/bash
  18. `将输出分隔符修改为制表符`
  19. [root@localhost ~]# awk -F":" -v OFS="\t" 'NR==1{print $1,$NF}' /tmp/passwd.txt
  20. root    /bin/bash
  21. `RS 指定符号为换行符`
  22. [root@localhost ~]# awk -v RS=' ' '{print NR,$0}' /tmp/awktest.txt
  23. 1 xux1
  24. 2 xux2
  25. 3 xux3
  26. 4 xux4
  27. 5 xux5
  28. 6
  29. xux6
  30. 7 xux7
  31. 8 xux8
  32. 9 xux9
  33. 10 xux10
  34. 11
  35. xux11
  36. `ORS 将换行符换成自定义符号`
  37. [root@localhost ~]# awk -v ORS='--------' '{print NR,$0}' /tmp/awktest.txt
  38. 1 xux1 xux2 xux3 xux4 xux5 --------2 xux6 xux7 xux8 xux9 xux10 --------3 xux11 xux12 xux13 xux14 xux15 --------4 xux16 xux17 xux18 xux19 xux20 --------5 xux21 xux22 xux23 xux24 xux25 --------6 xux26 xux27 xux28 xux29 xux30 --------7 xux31 xux32 xux33 xux34 xux35 --------8 xux36 xux37 xux38 xux39 xux40 --------9 xux41 xux42 xux43 xux44 xux45 --------10 xux46 xux47 xux48 xux49 xux50--------
  39. `BEGIN模式`
  40. [root@localhost ~]# awk 'BEGIN{print "这是begin模式"} NR==1{print NR,$0}' /tmp/awktest.txt
  41. 这是begin模式
  42. 1 xux1 xux2 xux3 xux4 xux5
  43. `BEGIN模式可以不加文件; awk可以使用自定义变量`
  44. [root@localhost ~]# awk -v name="plmm" 'BEGIN{print "我喜欢",name}'
  45. 我喜欢 plmm
  46. `ARGV[N] 第一个是awk命令本身 第二个是文件名`
  47. [root@localhost ~]# awk '{print ARGV[0],ARGV[1],$0}' /tmp/awktest.txt
  48. awk /tmp/awktest.txt xux1 xux2 xux3 xux4 xux5
  49. awk /tmp/awktest.txt xux6 xux7 xux8 xux9 xux10
  50. awk /tmp/awktest.txt xux11 xux12 xux13 xux14 xux15
  51. awk /tmp/awktest.txt xux16 xux17 xux18 xux19 xux20
  52. awk /tmp/awktest.txt xux21 xux22 xux23 xux24 xux25
  53. awk /tmp/awktest.txt xux26 xux27 xux28 xux29 xux30
  54. awk /tmp/awktest.txt xux31 xux32 xux33 xux34 xux35
  55. awk /tmp/awktest.txt xux36 xux37 xux38 xux39 xux40
  56. awk /tmp/awktest.txt xux41 xux42 xux43 xux44 xux45
  57. awk /tmp/awktest.txt xux46 xux47 xux48 xux49 xux50
  58. [root@localhost ~]# awk '{print ARGV[0],ARGV[1],ARGV[2],$0}' /tmp/awktest.txt
  59. awk /tmp/awktest.txt  xux1 xux2 xux3 xux4 xux5
  60. awk /tmp/awktest.txt  xux6 xux7 xux8 xux9 xux10
  61. awk /tmp/awktest.txt  xux11 xux12 xux13 xux14 xux15
  62. awk /tmp/awktest.txt  xux16 xux17 xux18 xux19 xux20
  63. awk /tmp/awktest.txt  xux21 xux22 xux23 xux24 xux25
  64. awk /tmp/awktest.txt  xux26 xux27 xux28 xux29 xux30
  65. awk /tmp/awktest.txt  xux31 xux32 xux33 xux34 xux35
  66. awk /tmp/awktest.txt  xux36 xux37 xux38 xux39 xux40
  67. awk /tmp/awktest.txt  xux41 xux42 xux43 xux44 xux45
  68. awk /tmp/awktest.txt  xux46 xux47 xux48 xux49 xux50
  69. `在引用外部变量`
  70. [root@localhost ~]# what="我喜欢plmm!!!"
  71. [root@localhost ~]# awk -v name=$what 'BEGIN{print name}'
  72. 我喜欢plmm!!!
复制代码
7,   print 和 printf 的区别

  • ​        printf动作默认不会添加换行符
  • ​    print 默认添加空格换行符
  • ​    printf需要指定format;

    • %d打印单个ASCII 字符 printf("The character is %c\n",x) 输出: The character is A%d打印一个十进制数 printf("The boy is %d years old\n",y) 输出:The boy is 15 years old%e打印数字的e 记数法形式 printf("z is %e\n",z) 打印: z is 2.3e+0 1%f打印一个浮点数 printf("z is %f\n", 2.3 * 2) 输出: z is 4.600000%o打印数字的八进制 printf("y is %o\n",y) 输出:z is 17%s打印一个字符串 print("The name of the culprit is %s\n",$1) 输出:The name of the culprit is Bob Smith

  • printf修饰符

    • -:左对齐,默认右对齐
    • +:显示数值符号;printf "%+d"

  1. [root@localhost ~]# awk '{printf $1}' /tmp/awktest.txt
  2. xux1xux6xux11xux16xux21xux26xux31xux36xux41xux46[root@localhost ~]#
  3. `%s`
  4. [root@localhost ~]# awk '{printf "%s\n",$1}' /tmp/awktest.txt
  5. xux1
  6. xux6
  7. xux11
  8. xux16
  9. xux21
  10. xux26
  11. xux31
  12. xux36
  13. xux41
  14. xux46
  15. [root@localhost ~]# awk '{printf "第一列 %s     第二列 %s    第三列 %s\n",$1,$2,$3}' /tmp/awktest.txt
  16. 第一列 xux1     第二列 xux2    第三列 xux3
  17. 第一列 xux6     第二列 xux7    第三列 xux8
  18. 第一列 xux11     第二列 xux12    第三列 xux13
  19. 第一列 xux16     第二列 xux17    第三列 xux18
  20. 第一列 xux21     第二列 xux22    第三列 xux23
  21. 第一列 xux26     第二列 xux27    第三列 xux28
  22. 第一列 xux31     第二列 xux32    第三列 xux33
  23. 第一列 xux36     第二列 xux37    第三列 xux38
  24. 第一列 xux41     第二列 xux42    第三列 xux43
  25. 第一列 xux46     第二列 xux47    第三列 xux48
  26. `%d`
  27. [root@localhost ~]# awk 'BEGIN{printf "%d%d%d%d\n",1,2,3,4}'
  28. 1234
  29. `- +对齐`
  30. [root@localhost ~]# awk '{printf "第一列 %-20s第二列 %-20s第三列 %-20s\n",$1,$2,$3}' /tmp/awktest.txt
  31. 第一列 xux1                第二列 xux2                第三列 xux3               
  32. 第一列 xux6                第二列 xux7                第三列 xux8               
  33. 第一列 xux11               第二列 xux12               第三列 xux13               
  34. 第一列 xux16               第二列 xux17               第三列 xux18               
  35. 第一列 xux21               第二列 xux22               第三列 xux23               
  36. 第一列 xux26               第二列 xux27               第三列 xux28               
  37. 第一列 xux31               第二列 xux32               第三列 xux33               
  38. 第一列 xux36               第二列 xux37               第三列 xux38               
  39. 第一列 xux41               第二列 xux42               第三列 xux43               
  40. 第一列 xux46               第二列 xux47               第三列 xux48   
复制代码
grep 练习题

  1. `找出root开头的行`
  2. [root@localhost ~]# grep '^root' /tmp/passwd.txt
  3. root:x:0:0:root:/root:/bin/bash
  4. `匹配以root开头或者以mysql开头的行,注意定位锚点`
  5. [root@localhost ~]# grep -E '^(root|mysql)' /etc/passwd
  6. root:x:0:0:root:/root:/bin/bash
  7. mysql:x:27:27:MariaDB Server:/var/lib/mysql:/sbin/nologin
  8. `过滤出除了root开头的行`
  9. [root@localhost ~]# grep -v '^root' /etc/passwd
  10. bin:x:1:1:bin:/bin:/sbin/nologin
  11. daemon:x:2:2:daemon:/sbin:/sbin/nologin
  12. adm:x:3:4:adm:/var/adm:/sbin/nologin
  13. `统计root出现的次数`
  14. [root@localhost ~]# grep 'root' /etc/passwd -c
  15. 2
  16. `匹配test用户最多一次 -m`
  17. [root@localhost ~]# grep '^test' /etc/passwd -m 1
  18. test:x:1000:1000:test:/home/test:/bin/bash
  19. `匹配多个文件,列出存在信息的文件名字`
  20. [root@localhost ~]# grep 'test' /tmp/passwd.txt /etc/passwd /tmp/test.txt -l
  21. /tmp/passwd.txt
  22. /etc/passwd
  23. `显示/etc/passwd文件中不以/bin/bash结尾的行`
  24. [root@localhost ~]# grep -v '/bin/bash$' /tmp/passwd.txt
  25. bin:x:1:1:bin:/bin:/sbin/nologin
  26. daemon:x:2:2:daemon:/sbin:/sbin/nologin
  27. adm:x:3:4:adm:/var/adm:/sbin/nologin
  28. lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
  29. `匹配uid和gid是2,3数字的行`
  30. [root@localhost ~]# grep -E '\<[0-9]{2,3}\>' /tmp/passwd.txt
  31. mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
  32. operator:x:11:0:operator:/root:/sbin/nologin
  33. games:x:12:100:games:/usr/games:/sbin/nologin
  34. ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
  35. nobody:x:99:99:Nobody:/:/sbin/nologin
  36. systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
  37. `找出文件中,以至少一个空白字符开头,后面是非空字符的行`
  38. [root@localhost ~]# grep '^[[:space:]].*' /tmp/luffy2.txt
  39. happy every day
  40. [root@localhost ~]# grep '^[[:space:]]+[^[:space:]]' /tmp/luffy2.txt  -E
  41. happy every day
  42. [root@localhost ~]# grep -E '^(root|mysql|xiao)' /tmp/passwd.txt
  43. root:x:0:0:root:/root:/bin/bash
  44. xiaosang:x:1001:1001::/home/xiaosang:/bin/bash
  45. mysql:x:27:27:MariaDB Server:/var/lib/mysql:/sbin/nologin
  46. xiao:x:555:555::/home/www:/shbin/nologin
  47. xiao1:x:555:555::/home/www:/shbin/nologin
  48. [root@localhost ~]# grep -E '^(root|mysql|xiao)\>' /tmp/passwd.txt
  49. root:x:0:0:root:/root:/bin/bash
  50. mysql:x:27:27:MariaDB Server:/var/lib/mysql:/sbin/nologin
  51. xiao:x:555:555::/home/www:/shbin/nologin
  52. `找出/etc/init.d/functions文件中的所有函数名`
  53. [root@localhost ~]# grep -E '[a-zA-Z]+\(\)' /etc/init.d/functions
  54. checkpid() {
  55. __kill_pids_term_kill_checkpids() {
  56. __kill_pids_term_kill() {
  57. __pids_var_run() {
  58. __pids_pidof() {
  59. daemon() {
  60. killproc() {
  61. `找出:前面字符与结尾相同的行`
  62. [root@localhost ~]# grep -E '^([^:]+).*\1$' /tmp/passwd.txt
  63. sync:x:5:0:sync:/sbin:/bin/sync
  64. shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
  65. halt:x:7:0:halt:/sbin:/sbin/halt
  66. nobody:x:99:99:Nobody:/:/sbin/nologin
  67. ntp:x:38:38::/etc/ntp:/sbin/nologin
  68. nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
  69. nginx:x:987:981:Nginx web server:/var/lib/nginx:/sbin/nologin
复制代码
sed 练习题

  1. `将开头是#符号的行和空行删除`
  2. [root@localhost ~]# sed -e '/^$/d' -e '/^#/d' /tmp/luffy2.txt
  3. I teach linux.
  4. I like c++.
  5. happy every day
  6. good good study
  7. `将文本中空行,开头是空格的行替换为#`
  8. [root@localhost ~]# sed -e 's/^[[:space:]]/#/g' -e 's/^$/#/g' /tmp/luffy2.txt
  9. I teach linux.
  10. #
  11. I like c++.
  12. #
  13. happy every day
  14. #
  15. #good good study
  16. #
  17. #
  18. `在文本前三行加上@符号` ==用了扩展正则表达式 -r,引用了原文 \1==
  19. [root@localhost ~]# sed  -r '1,3s/(^.)|(^$)/@\1/' /tmp/luffy2.txt
  20. @I teach linux.
  21. @
  22. @I like c++.
  23. happy every day
  24. good good study
  25. `sed 取ip地址`
  26. [root@localhost ~]# ifconfig
  27. ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
  28.         inet 192.168.70.14  netmask 255.255.255.0  broadcast 192.168.70.255
  29.         inet6 fe80::3a93:caf:b995:b1d6  prefixlen 64  scopeid 0x20<link>
  30.         ether 00:0c:29:c0:b0:a1  txqueuelen 1000  (Ethernet)
  31.         RX packets 13469  bytes 1208013 (1.1 MiB)
  32.         RX errors 0  dropped 0  overruns 0  frame 0
  33.         TX packets 9149  bytes 1040700 (1016.3 KiB)
  34.         TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
  35.         
  36. [root@localhost ~]# ifconfig ens33 | sed '2s/^.*inet//;2s/netm.*//p'  -n
  37. 192.168.70.14
  38. `sed 找出系统版本`
  39. [root@localhost ~]# cat /etc/centos-release
  40. CentOS Linux release 7.9.2009 (Core)
  41. `中括号中间^取反,+贪婪匹配,() \1 扩展正则`
  42. [root@localhost ~]# sed -r 's/^.*release[[:space:]]//;s/([^.]+).*/\1/p' /etc/centos-release -n
  43. 7
复制代码
awk练习题

<blockquote>[code]`在当前系统中打印用户的用户名和家目录`[root@localhost ~]# awk -F ":" '$3>=1000{print $1,$(NF-1)}' /tmp/passwd.txt nfsnobody /var/lib/nfstest /home/testxiaosang /home/xiaosangbiaosang /home/biaosang`给/tmp/xuxu.txt文件的前五行,添加#号`[root@localhost ~]# awk 'NR

举报 回复 使用道具