Linux之shell学习(三)——文本处理三剑客grep、sed、awk

偏执的太偏执、 2022-03-06 02:44 454阅读 0赞

1、grep

1.grep的格式

grep 匹配条件 处理文件

例如:

  1. grep root /etc/passwd ##在/etc/passwd全局搜索含有‘root’关键字的内容
  2. grep ^root /etc/passwd ##在/etc/passwd全局搜索含有‘root’,且‘root’开头
  3. grep root$ /etc/passwd ##在/etc/passwd全局搜索含有‘root’,且‘root’结尾
  4. grep -i root /etc/passwd ##在/etc/passwd全局搜索含有‘root’,且不区分
  5. grep -E "root|ROOT" /etc/passwd ##在/etc/passwd

2.grep中的正则表达式

  1. ^hello ##以hello开头
  2. hello$ ##以hello结尾
  3. 'h....o' ##'h开头,o结尾,中间4个字符'
  4. 'h.....' ##'h开头,后面5个字符'
  5. '.....o' ##'o结尾,前面5个字符'

3.grep中字符的匹配次数设定

  1. * 字符出现 [0-任意次 ]
  2. \? 字符出现 [ 0-1 ]
  3. \+ 字符出现 [ 1-任意次]
  4. \{ n\} 字符出现 [ n ]
  5. \{ m,n} 字符出现 [ 最少出现m次,最多出现n次]
  6. \{ 0,n\} 字符出现 [ 0-n次]
  7. \{ m,\} 字符出现 [ 至少m次]
  8. \(xy\)\{ n\}xy 关键字出现[n次]
  9. .* 关键字之间匹配任意字符

2、sed

sed 命令格式
调用sed命令有两种形式:

  1. sed[option]'command' file(s)
  2. sed[option] -f scriptfile file(s)

sed对字符的处理

  1. p 显示
  2. d 删除
  3. a 添加
  4. c 替换
  5. w 写入
  6. i 插入

1.p模式操作

  1. sed -n '/\:/p' fstab ##显示有:的行的内容
  2. sed -n '/UUID$/P' fstab ##显示UUID结尾的行的内容
  3. sed -n '/^UUID/P' fstab ##显示UUID开头的行的内容
  4. sed -n '2,6p' fstab ##显示第二行到第六行的内容
  5. sed -n '2,6!p' fstab ##显示除了2-6行都显示

2.d模式操作

  1. sed '/^UUID/d' /etc/fstab ##删除UUID开头的行的内容
  2. sed '/^#/d' /etc/fstab ##删除#开头的行的内容
  3. sed '/^$/d' /etc/fstab ##删除空行
  4. sed '1,4d' /etc/fstab ##删除1-4行的内容
  5. sed '/^UUID/!d' /etc/fstab ##删除除UUID开头外的行的内容

3.a模式操作

  1. sed '/^UUID/ahello linux' fstab ##在UUID开头的行的后添加‘hello linux’
  2. sed '/^UUID/ahello\nlinux' fstab ##在UUID开头的行的后面添加‘hello\nlinux’

4.i模式操作

  1. sed '/^UUID/ihello\nlinux' fstab ##在UUID开头的行的前面添加‘hello\nlinux’

5.w模式操作

  1. sed '/^#/w /mnt/testfile' fstab ##将fstab中以#为开头的行整合到/mnt/testfile中
  2. sed -n '/^#/w /mnt/testfile' fstab ##不显示
  3. sed '6r/mnt/linux' fstab ##将/mnt/linux中的所有内容整合到fstab的第六行中

6.c模式操作

  1. sed '/^#/chello\nlinux' fstab ##将#开头的行的内容用‘hello\nlinux’替换

sed的其他用法

  1. sed 'G' data ##在每行行后插入一个空白行
  2. sed '$!G' data ##在除最后一行外的每行行后插入一个空白行
  3. sed '=' data | sed 'N;s/\n//' ##每行行前添加行号
  4. sed -n '$p' data ##显示最后一行

3、awk

报告生成器
awk处理机制:awk会逐行处理文本,支持在处理第一行之前做一些准备工作,以及在处理完最后一行做一些总结性质的工作,在命令格式上分别体现以下:

  1. BEGIN{ }:读入第一行文本之前执行,一般用来初始化操作
  2. { }:逐行处理,逐行读入文本执行相应的处理,是最常见的编辑指令
  3. END{ }:处理完最后一行文本之后执行,一般用来输出处理结果
  4. awk -F : 'BEGIN{print "hello"}{print $1}END{print "end"}' /etc/passwd
  5. #在/etc/passwd文件逐行打印每一行第一列的内容,并在首行添加‘hello’,行尾添加‘end’
  6. awk -F : '{print FILENAME}' /etc/passwd
  7. #在/etc/passwd文件逐行打印‘/etc/passwd’,并处理总行数次
  8. awk -F : '{print NR}' /etc/passwd
  9. #打印‘/etc/passwd’的行号
  10. awk -F : '{print NF}' /etc/passwd
  11. #打印‘/etc/passwd’的列号,并处理总行数次
  12. awk -F : 'BEGIN{print "NAME"}'
  13. #在开始处理文本时,打印‘NAME’
  14. awk -F : '/bash$/{print $1}' /etc/passwd
  15. awk -F : '{ print $1}' /etc/passwd
  16. awk -F : '/bash$/{ print $1}' /etc/passwd
  17. awk -F : '!/bash$/{ print $1}' /etc/passwd
  18. awk -F : 'BEGIN{n=0}/bash$/{n++}END{print n}' /etc/passwd
  19. awk '/[a-d]/{print}' /etc/passwd
  20. awk '/^[a-d]/{print}' /etc/passwd
  21. awk '!/^[a-d]/{print}' /etc/passwd
  22. awk '!/^[^a-d]/{print}' /etc/passwd
  23. awk '/^a|bash$/{print}' /etc/passwd
  24. awk '!/^a|bash$/{print}' /etc/passwd
  25. awk '/!^a|bash$/{print}' /etc/passwd
  26. awk -F : '$6~/bin$/' /etc/passwd
  27. awk -F : '$6~/\<bin$/' /etc/passwd
  28. awk -F : '$6!~/^\/home/{print $1}' /etc/passwd
  29. awk -F : '$6!~/^\/home/&&/bash$/{print $1}' /etc/passwd
  30. ifconfig eth0 | awk '/inet\>/{print $2}'

#find #

  1. -name
  2. -type
  3. -perm
  4. -c 默认是天
  5. find /etc -name passwd
  6. find /etc -maxdepth 1 -name passwd ##查找深度
  7. find /etc -mindepth 2 -name passwd
  8. find /mnt/ -group student
  9. find /mnt/ -user student -o -group student
  10. find /mnt/ -user root -a -group student
  11. find /mnt/ -size +20k -exec rm -fr { } \; ##找到大于20k的文件并删除

-cmin 小于x分钟

  1. ugo必须包含所写条件
  2. 企业7以后是/
  3. 企业7之前是+
  4. find /etc/ -type l ##查找/etc下链接型的文件
  5. find /etc/ -ctime -10 ##时间小于10天
  6. find /etc/ -ctime +10 ##大于10天
  7. find /etc/ -cmin +/-10 ##10分钟
  8. find /etc/ -cmin 10

发表评论

表情:
评论列表 (有 0 条评论,454人围观)

还没有评论,来说两句吧...

相关阅读