在运维工作中,grep
、awk
、sed
和find
是四个非常强大的命令行工具,以下是对于这四个工具的详细使用方法和应用场景介绍说明:
grep
grep
是一个用于搜索文本内容的工具,可以在文件中查找符合特定模式的行。
基本语法
bash
grep [选项] 搜索模式 文件
常用选项
-i
:忽略大小写。-v
:反向选择,显示不匹配的行。-n
:显示匹配行的行号。-r
或-R
:递归搜索目录中的文件。-w
:匹配整词。-o
:只输出匹配的部分,而不是整行。
示例
-
查找包含特定字符串的行
bash# 查找该文件中包含字符串"error"的行 grep "error" /var/log/syslog
-
忽略大小写
bash# 查找包含"error"的行,忽略大小写。 grep -i "error" /var/log/syslog
-
显示行号
bashgrep -n "error" /var/log/syslog
-
递归搜索目录
bash# 在 /var/log/ 目录及其子目录中递归搜索包含 "error" 的行。 grep -r "error" /var/log/
-
反向选择
bash# 显示不包含"error"的行 grep -v "error" /var/log/syslog
awk
awk
是一个功能强大的文本处理工具,可以对文本文件进行复杂的分析和处理。适合处理结构化的文本数据(如日志文件、CSV文件等)。
基本语法
bash
awk [选项] '模式 {动作}' 文件
常用功能
- 分割字段 :
awk
默认以空格或制表符作为字段分隔符,字段可以通过$1
、$2
等访问。 - 模式匹配:通过正则表达式或条件语句选择特定行。
- 内置变量 :
NF
:当前行的字段数。NR
:当前行号。FS
:字段分隔符(默认为空格或制表符)。OFS
:输出字符分隔符(默认空格)。ORS
:输出记录分隔符(默认换行符)。
示例
bash
# 测试文本内容如下:
[root@worker233 test]# cat example.txt
a b c
d e f
-
打印文件的第2列
bashawk '{print $2}' example.txt
-
打印文件的第50行
bashawk 'NR=50' example.txt
-
计算文件中每行的字段数
bashawk '{print NF}' example.txt
-
处理CSV文件
bash# 是输出第1列与第3列中内容 awk -F, 'print $1,$3}' data.csv
-
条件筛选
bash# 筛选出第2列值大于20的行。 awk '$2 > 20' data.csv
-
累加和计算
bash# 计算文件中第1列的总和 awk '{sum += $1} END {print sum}' data.txt
sed
sed
是一个用于处理文本流的工具,对文本进行编辑、替换、删除等操作。适用于文件批量修改。
基本语法
bash
sed [选项] '命令' 文件
常用命令
s/就内容/新内容/
:替换文件中内容。d
:删除行。p
:打印行。i
:在当前行前插入内容。a
:在当前行后追加内容。c
:替换当前行。q
:退出。
示例
-
替换文件中内容
bashsed 's/old/new/' example.txt
-
替换第50行内容。
bashsed '50s/.*/new content/' example.txt
-
删除第50行
bashsed '50d' example.txt
-
打印第50行
bashsed -n '50p' example.txt
-
删除文件中的空行
bashsed '/^$/d' example.txt
find
find
是用于搜索文件和目录的工具,可以根据文件名、类型、大小、权限、修改时间等条件进行搜索。
基本语法
bash
find [搜索路径] [选项] [表达式]
常用选项
-name
:根据文件名搜索。-type
:根据文件类型搜索(f
表示普通文件,d
表示目录)。-size
:根据文件大小搜索。-mtime
:根据文件修改时间搜索。-exec
:对搜索到的文件执行的命令-delete
:删除搜索到的文件。
示例
-
搜索特定目录下的所有
.txt
文件bashfind /path/to/directory -name "*.txt"
-
搜索特定目录下的所有目录
bashfind /path/to/directory -type d
-
搜索最近7天内修改过的文件
bashfind /path/to/directory -mtime -7
-
搜索大于10MB的文件
bashfind /path/to/directory -size +10M
-
删除搜索到的文件
bashfind /path/to/directory -name "*.tmp" -delete
综合案例
需求:查找/var/log
目录下所有包含 "error" 的日志文件,并提取第50行的内容。
bash
find /var/log/ -name "*.log" -exec grep -n "error" {} \; | awk -F: '{print $1, $2}' | sed -n '50p'