Linux四剑客grep、find、sed、awk使用

 


‌介绍

Linux四剑客‌是指在Linux系统中非常常用的四个命令工具,它们分别是grep、find、sed和awk。这四个工具在Linux系统中具有非常强大的功能,可以方便快捷地对文本进行搜索、处理和查找。‌

grep命令

作用

grep命令主要用于过滤文件内容,在文件中找到你需要或者不要的内容,类似与一个漏斗.

语法

grep [选项] [关键字] 文件

常用选项说明

这里只列出了实际工作中常用的选项,如果有其它的选项漏掉的,可以进行评论

  • -i:不区分关键字的大小写,ignore case
  • -n:显示文件的行号
  • -v:取反,排除关键字
  • -r:递归搜索指定目录下的所有文件,例如grep -r "pattern" /path/to/directory
  • -c:计数,只返回匹配的行数,类似wc -l命令
  • -e:同时搜索多个模式,匹配任意一个即可。例如grep -e "pattern1" -e "pattern2" file.txt
  • -E:可以使用正则表达式,例如grep -E "pattern1|pattern2" file.txt
  • -l:在多个文件中搜索时,只显示包含匹配模式的文件名,而不是文件内容。例如grep -l "pattern" *.txt
  • -L:在多个文件中搜索时,只显示不包含匹配模式的文件名。例如grep -L "pattern" *.txt
  • -C:显示匹配行前后的指定行数。例如grep -C 2 "pattern" file.txt
  • -F:匹配包含固定字符串的行。例如grep -F "fixed" string file.txt
  • -A:显示匹配行后的指定行数。如grep -A 2 "pattern" file.txt
  • -B:显示匹配行前的指定行数。如grep -B 2 "pattern" file.txt

find命令

作用

find 是一个在 Linux 和 Unix 系统中非常强大的命令行工具,用于在文件系统中搜索文件和目录。它可以根据文件名、路径、大小、修改时间、权限等多种条件进行搜索

语法

  find [搜索路径] [选项] [表达式]
  • 搜索路径,指定从哪个目录开始搜索,如果不指定搜索深度,默认会在指定目录下递归搜索。如果不指定目录,默认从当前目录开始
  • 选项:用于控制搜索行为,例如递归深度,搜索类型等
  • 表达式:用于定义搜索条件,如文件名、大小、修改时间等

常用选项

  • -name:根据文件名搜索
  #搜索/etc目录下hosts文件
  [root@master:~]# find /etc/ -name "hosts"
  /etc/hosts
   
  #搜索/etc目录下所有以conf结尾的文件
  [root@master:~]# find /etc -name "*.conf"
  /etc/nscd.conf
  /etc/nsswitch.conf
  ...
  /etc/modules-load.d/modules.conf
  /etc/request-key.d/id_resolver.conf
  /etc/kubernetes/scheduler.conf
   
  • -type:指定文件类型
    • f:文件类型为普通文件
    • d:文件类型为目录
    • l:文件类型为符号链接
  # 搜索/etc目录下所有的目录
  [root@master:~]$ find /etc/ -type d
   
  # 搜索/etc目录下所有的文件
  [root@master:~]$ find /etc/ -type f
   
  # 搜索/etc目录下所有的符号连接
  [root@master:~]$ find /etc/ -type l
  • -size:根据文件大小搜索
    • +n:文件大于n
    • -n:文件小于n
    • n:文件等于n
    • 单位:c(byte)、k(kb)、M(Mib)、G(Gib)
  # 搜索/etc目录下大于10K的文件
  [root@master:~]$ find /etc/ -size +10k
  /etc/login.defs
  /etc/X11/rgb.txt
  /etc/ld.so.cache
   
  • -mtime:根据文件修改时间搜索,单位天。
    • +n:超过 n 天。
    • -n:少于 n 天。
    • n:正好 n 天。
  #查找etc目录下修改时间大于30天的文件
  [root@master:~]$ find /etc/ -mtime +30
  • -mmin:根据文件修改时间搜索,单位分钟
    • +m:超过 m 分钟
    • -m:少于 m 分钟
    • m:正好 m 分钟
  #查找etc目录下修改时间大于30分钟的文件
  [root@master:~]$ find /etc/ -mmin +30
  • -perm:根据文件权限进行搜索
  [root@master:~]$ find /etc/ -perm 755
  • -user:根据文件拥有者进行搜索
  # 搜索etc目录下,用户为root的文件
  [root@master:~]$ find /etc/ -user root
  • -group:根据文件所属组进行搜索
  [root@master:~]$ find /etc/ -group root
  • -maxdepth:限制搜索的最大深度,也就是指定递归搜索的深度
    1代表指定目录下,2代表指定目录下的下一层目录,依次递归下去
  # 查找当前目录下以conf结尾的文件
  [root@master:~]$ find /etc/ -maxdepth 1 -name "*.conf"
  • -empty:查找空目录或空文件
  # 查找空目录
  [root@master:~]$ find /etc/ -type d -empty
   
  # 查找空文件
  [root@master:~]$ find /etc/ -type f -empty
  • -delete:直接删除文件
  # 查找到空文件直接删除
  [root@master:~]$ find /var/ -type f -empty -delete
  • -exec:对搜索到的文件执行命令
  # 查找到空文件进行删除
  [root@master:~]$ find /var/ -type f -empty -exec rm -f {} \
  • -a:使用-a(逻辑与,and)或者默认的空格分隔符组合多个条件
  [root@master:~]$ find /path/to/search -type f -size +10M -mtime +30
  • -o:使用-o(逻辑或,or)组合多个条件
  #搜索文件扩展名为txt或log的文件
  [root@master:~]$ find /path/to/search \( -name "*.txt" -o -name "*.log" \)

sed命令

sed(Stream Editor)是一个流式文本编辑器,用于对文本进行快速的、非交互式的编辑。它能够对输入的文本进行各种操作,如替换、删除、插入、提取等,并将结果输出到标准输出(stdout)。

基本语法

  sed [选项] '编辑命令' 文件名
  • 选项:用于控制 sed 的行为,例如 -i 表示直接修改文件,-n 表示静默模式。
  • 编辑命令:定义对文本的具体操作,通常放在单引号或双引号中。
  • 文件名:指定要处理的文件。如果省略文件名,sed 会从标准输入读取数据。

sed常用选项:

  • -n:默认情况下,sed会在所有的脚本执行完毕后,自动输出处理后的内容,而该选项会屏蔽自动输出,需要使用print命令来完成输出。一般结合p使用
  • -i:此选项会直接修改源文件,要慎用
  • -i.bak:先备份再修改文件内容,推荐使用
  • -r:支持扩展正则

sed 打印行

示例一:打印出文件所有的内容

  [root@master:~]# sed '' /etc/passwd
  root:x:0:0:root:/root:/bin/bash
  #...省略万字内容
  devops:x:1000:1000::/home/devops:/bin/sh

示例二:打印出文件的第五行数据

  [root@master:~]# sed -n '5p' /etc/passwd
  sync:x:4:65534:sync:/bin:/bin/sync

示例三:打印出文件的第五行至第十行数据

  [root@master:~]# sed -n '5,10p' /etc/passwd
  sync:x:4:65534:sync:/bin:/bin/sync
  games:x:5:60:games:/usr/games:/usr/sbin/nologin
  man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
  lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
  mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
  news:x:9:9:news:/var/spool/news:/usr/sbin/nologin

示例四:打印出文件的最后一行数据

  [root@master:~]# sed -n '$p' /etc/passwd
  devops:x:1000:1000::/home/devops:/bin/sh

sed 过滤内容

示例一:过滤包含root的行

  [root@master:~]# sed -n '/root/p' /etc/passwd
  root:x:0:0:root:/root:/bin/bash

示例二:过滤包含root和devops的行

  [root@master:~]# sed -nr '/root|devops/p' /etc/passwd
  root:x:0:0:root:/root:/bin/bash
  devops:x:1000:1000::/home/devops:/bin/sh

sed 替换文件内容

语法:

  sed [选项] 's#源内容#要修改的内容#g' 文件名
  选项说明:
  -i:替换文件
  -i.bak:先备份文件为源文件名.bak

示例:

  # 先模拟数据
  [root@master:~]# cat>1.txt<<EOF
  > huangsir
  > huangsir
  > huangsir666
  > EOF
   
  # 不加-i选项,发现并没有替换文件内容
  [[root@master:~]]# sed s#huangsir#root#g 1.txt
  root
  root
  root666
  [root@master:~]# cat 1.txt
  huangsir
  huangsir
  huangsir666
   
   
  # 添加-i.bak进行替换
  root@master:~# sed -i.bak s#huangsir#root#g 1.txt
  root@master:~# ll 1.txt 1.txt.bak
  -rw-r--r-- 1 root root 18 Apr 17 16:28 1.txt
  -rw-r--r-- 1 root root 30 Apr 17 16:26 1.txt.bak
  root@master:~# cat 1.txt
  root
  root
  root666
  root@master:~# cat 1.txt.bak
  huangsir
  huangsir
  huangsir666
   
  # 直接修改,不备份
  root@master:~# sed -i s#huangsir#root#g 1.txt.bak
  root@master:~# cat 1.txt.bak
  root
  root
  root666

示例:分组进行替换

  root@master:~# echo 123456 | sed -r 's#(12)(34)(56)#\1\2\3#g'
  123456
  root@master:~# echo 123456 | sed -r 's#(12)(34)(56)#\3\2\1#g'
  563412

sed 删除内容

编辑命令中添加d可以删除文件内容

示例:删除某一行的数据

  # 删除第一行的数据
  sed -i '1d' 1.txt
   
  # 删除最后一行的数据
  sed -i '$d' 1.txt
   
  # 删除前缀为1的行
  sed -i '/^1/d' 1.txt

sed 增加文件内容

指令:

  • c:replace:clean 清空指定行,然后写入内容
  • a:apennd,在指定那行下面增加一行
  • i:insert,在指定那行上面增加一行

示例:在文件第一行下增加一行数据

  # 在第一行后追加一行haha数据
  sed -i '1a haha' 1.txt

awk命令

awk能够对文本文件进行复杂的分析、处理和格式化操作。与 sed 不同,awk 更适合处理结构化的文本数据,例如带有分隔符的表格数据。
作用:取行、取列、统计与计算

语法

  awk [选项] '模式 {动作}' 文件名

常用选项

  • -F:指定字段分隔符(默认为空白字符,如空格或制表符)。
  • -f:从文件中读取 awk 脚本。
  • -v:定义变量的初始值

使用awk取行

awk中内置变量NR表示行

示例:

  # 取出第一行的数据
  root@master:~# awk 'NR==1' /etc/passwd
  root:x:0:0:root:/root:/bin/bash
   
  # 取出第三行到第十行的数据
  root@master:~# awk 'NR>=3 && NR<=10' /etc/passwd
  bin:x:2:2:bin:/bin:/usr/sbin/nologin
  sys:x:3:3:sys:/dev:/usr/sbin/nologin
  sync:x:4:65534:sync:/bin:/bin/sync
  games:x:5:60:games:/usr/games:/usr/sbin/nologin
  man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
  lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
  mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
  news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
   
  # 取出包含bash的行
  root@master:~# awk '/bash/' /etc/passwd
  root:x:0:0:root:/root:/bin/bash
   
  # 取出包含root和devops的行
  root@master:~# awk '/root|devops/' /etc/passwd
  root:x:0:0:root:/root:/bin/bash
  devops:x:1000:1000::/home/devops:/bin/sh
   
   
  # 取出文件中指定时间段内的日志
  root@master:~# awk '/11:00:00/,/11:10:00/' /acces.log

awk取列

awk中内置变量NF表示列

示例:

  # 取出/etc/hosts文件的第三列、最后一列
  root@master:~# awk '{print $3,$NF}' /etc/hosts
  localhost
  following hosts
  ip6-localhost ip6-loopback
  ip6-allnodes
  ip6-allrouters
  iv-ydpkgu0jcwwh2yox8410 iv-ydpkgu0jcwwh2yox8410
   
  # 对齐
  root@master:~# awk '{print $3,$NF}' /etc/hosts | column -t
  localhost
  following hosts
  ip6-localhost ip6-loopback
  ip6-allnodes
  ip6-allrouters
  iv-ydpkgu0jcwwh2yox8410 iv-ydpkgu0jcwwh2yox8410
   
   

awk取行取列

示例:取出ip a s eth0的IP地址

  root@master:~# ip a s eth0
  2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
  link/ether 00:16:3e:16:5b:ef brd ff:ff:ff:ff:ff:ff
  inet 10.3.0.86/20 brd 10.3.15.255 scope global dynamic eth0
  valid_lft 310239265sec preferred_lft 310239265sec
  inet6 fe80::216:3eff:fe16:5bef/64 scope link
  valid_lft forever preferred_lft forever
   
  root@master:~# ip a s eth0 | awk 'NR==3' | awk -F 'inet |/20' '{print $2}'
  10.3.0.86
   

示例:统计free结果中内存空闲率

  root@master:~# free | awk 'NR==2{print $NF/$2}'
  0.82089
  root@master:~# free | awk 'NR==2{print $NF/$2*100"%"}'
  82.0729%

awk计算

大多数情况都可以使用awk进行算数运算,awk可以进行整数、小数的运算

基础用法示例:

  root@master:~$ awk 'BEGIN{print 1/3}'
  0.333333
  root@master:~$ awk 'BEGIN{print 2*3}'
  6
  root@master:~$ awk 'BEGIN{print 3+3}'
  6
  root@master:~$ awk 'BEGIN{print 4-3}'
  1

携带变量示例
awk -v选项用于创建或修改awk中的变量,-v是shell脚本与awk的桥梁
在awk中各种变量直接使用即可,不要加上$,如果加上了会被awk认为是取列

  root@master:~$ num1=2
  root@master:~$ num2=5
  root@master:~$ awk -va1=${num1} -va2=${num2} 'BEGIN{print a1/a2}'
  0.4
  root@master:~$ awk -va1=${num1} -va2=${num2} 'BEGIN{print a1*a2}'
  10
  root@master:~$ awk -va1=${num1} -va2=${num2} 'BEGIN{print a1+a2}'
  7
  root@master:~$ awk -va1=${num1} -va2=${num2} 'BEGIN{print a1-a2}'
  -3

 

2025-04-18 16:29:11【出处】:https://www.cnblogs.com/huangSir-devops/p/18804436

=======================================================================================

posted on 2025-04-18 16:29  jack_Meng  阅读(164)  评论(0)    收藏  举报

导航