Shell 03_Shell高频使用命令用法指南

一、grep 命令

1.1 grep 命令的基本用法

1
grep -[选项参数] --[健值参数] "pattern" file/dir 
  • 常用选项
  • -I:用于排除grep中的二进制文件
  • -i:忽略大小写。
  • -r:递归搜索目录及其子目录。
  • -n:显示匹配行的行号。
  • -v:显示不匹配的行。
  • -l:只显示匹配的文件名,而不显示匹配的行。
  • -w:只匹配整个单词,而不是部分单词。
  • -E:使用扩展正则表达式。
  • -F:将模式视为固定字符串,而不是正则表达式。
  • -A: 显示匹配行之后的几行。
  • -B:显示匹配行之前的几行。
  • -C:显示匹配行前后各几行。
  • -c: 统计所有每个文件匹配的行数;–不好用,实际用处不大;
  • -a:将二进制文件视为文本文件进行搜索
  • –-color=auto: 高亮显示该字符串;一般常用:alias grep 'grep --color=auto'
  • –-exclude: 排除特定文件。
  • –-exclude-dir: 排除特定目录。

最常用法:grep -Inr "pattern"

1.2 常见用法

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# 1 在文件中基本查找
grep "pattern" file.txt

# 2 递归搜索目录中的所有文件
grep -r "pattern" directory/

# 3 忽略大小写
grep -i "pattern" file.txt

# 4 显示匹配的行号:
grep -n "pattern" file.txt

# 5 显示不匹配的行
grep -v "pattern" file.txt

# 6 只显示匹配的文件名
grep -l "pattern" file.txt

# 7 使用扩展正则表达式
grep -E "pattern1|pattern2" file.txt

# 8 将pattern看为固定字符串
grep -F "pattern" file.txt

# 9 统计匹配行数
grep -c 'pattern' filename.txt

# 10 高亮显示该字符串
grep --color=auto 'pattern' filename.txt

# 11 匹配整个单词
grep -w 'word' filename.txt

# 12 排除特定文件
grep -r --exclude='*.log' 'pattern' 

# 13 排除特定目录
grep -r --exclude-dir={dir1,dir2} 'pattern' /path/to/directory/

# 14 搜素匹配并显示之后几行
grep -A 3 'pattern' filename.txt
grep -B 3 'pattern' filename.txt
grep -C 3 'pattern' filename.txt

二、 find 命令

2.1 find 命令的基本用法

1
find [路径] [选项] [表达式]

常用选项

  • -name:按文件名搜索。
  • -type:按文件类型搜索(如 f 表示普通文件,d 表示目录)。
  • -size:按文件大小搜索(如 +10M 表示大于10MB的文件)。
  • -mtime:按文件修改时间搜索(如 -5 表示5天内修改过的文件)。
  • -exec:对搜索到的文件执行指定的命令。

2.2 常见用法

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# 1 按文件名搜索
find ./ -name "filename.txt"
find ./ -iname "filename.txt" # 忽略大小写文件名
# 2 按文件类型搜素
find ./ -type f # 仅搜索文件
find ./ -type d # 仅搜素目录
find ./ -type l # 仅搜素符号链接
# 3 按文件大小搜素
find ./ -size +10M
find ./ -size -1k
# 4 按文件修改时间搜索
find ./ -mtime -5
find ./ -mtime +30
# 5 按文件权限模式搜索
find ./ -perm /644
# 6 按用户名搜素
find ./ -user username
find ./ -group groupname


#!/bin/bash

# 查找并打印所有 .txt 文件
echo "Finding all .txt files:"
find . -name "*.txt"

# 查找并删除所有 .tmp 文件
echo "Deleting all .tmp files:"
find . -name "*.tmp" -delete

# 查找并压缩所有 .log 文件
echo "Compressing all .log files into logs.tar.gz:"
find . -name "*.log" -exec tar -czvf logs.tar.gz {} +

# 查找并重命名所有 .bak 文件为 .bak.old
echo "Renaming all .bak files to .bak.old:"
find . -name "*.bak" -exec mv {} {}.old \;

# 查找并统计大于 1MB 的文件数量
echo "Counting files larger than 1MB:"
find . -size +1M | wc -l

# 查找并列出最近一周内修改过的文件
echo "Listing files modified in the last week:"
find . -mtime -7

2.3 组合用法

1
2
3
4
5
6
7
8
9
# -exec: 对找到的文件执行命令
find . -name "*.txt" -exec cat {} \;
# -delete: 删除找到的文件
find . -name "*.tmp" -delete

# 组合条件
find . -type f -and -name "*.txt"
find . -type f -or -type d
find . -type f -not -name "*.log"

三、xargs 命令

3.1 xargs 命令的基本用法

xargs 命令用于将标准输入转换为命令行参数。

1
command | xargs [选项] [命令]
  • command:产生标准输出的命令。
  • [选项]:控制 xargs 的行为。
  • 命令:要执行的命令及其参数。

常用选项: -I:指定一个替换字符串,用于在命令中替换输入的参数。 -n:指定每次传递给命令的参数数量。 -P:指定并行执行的进程数。 -r:如果输入为空,则不执行命令。 -t:在执行命令之前,先打印出命令 -p;执行命令前询问 -t: 显示即将执行的命令

3.2 常见用法

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
# 1 -p:在执行每个命令前提示用户确认
find . -name "*.txt" | xargs -p rm

# 2 -a file:从文件中读取输入,而不是标准输入
xargs -a filename.txt command

# 3 -t:显示即将执行的命令
find . -name "*.txt" | xargs -t rm

# 4 -I replace-str:将输入中的每一行替换为 replace-str 中的 {}
find . -name "*.txt" | xargs -I {} cp {} /backup/{}

# 5 -n max-args:每次传递的最大参数数量
find . -name "*.txt" | xargs -n 5 rm

# 6 使用 -r 选项避免在输入为空时执行命令
echo "" | xargs -r rm

# 7 使用 -t 选项在执行命令之前打印命令
echo "file1.txt file2.txt file3.txt" | xargs -t rm

# 8 -d delim:指定输入项之间的分隔符(默认为空白字符
echo "file1.txt|file2.txt" | xargs -d '|' rm

# 9 -0:输入项之间用 NUL 字符分隔(通常与 find -print0 结合使用
find . -name "*.txt" -print0 | xargs -0 rm

# 10 -P max-procs:同时运行的最大进程数
find . -name "*.txt" | xargs -P 4 gzip

# 11 -E eof-str:指定输入结束字符串
echo "file1.txt\nfile2.txt\nEOF" | xargs -E EOF rm

# 12 -r 或 --no-run-if-empty:如果没有输入,则不执行命令
find . -name "*.log" | xargs -r rm

# 示例1:基本搜索并删除文件
find . -name "*.tmp" | xargs rm
# 这将删除所有 .tmp 文件。

# 示例2:查找并复制文件到另一个目录
find . -name "*.jpg" | xargs -I {} cp {} /backup/pictures/
# 这将把所有 .jpg 文件复制到 /backup/pictures/ 目录中。

# 示例3:查找并压缩文件
find . -name "*.log" | xargs tar -czvf logs.tar.gz
# 这将把所有 .log 文件压缩成 logs.tar.gz。

# 示例4:限制每次传递的参数数量
find . -name "*.txt" | xargs -n 2 rm
# 这将每次传递两个 .txt 文件给 rm 命令。

# 示例5:使用 -I 替换占位符
find . -name "*.bak" | xargs -I {} mv {} {}.old
# 这将把所有 .bak 文件重命名为 .bak.old。

# 示例6:并发执行命令
find . -name "*.jpg" | xargs -P 4 gzip
# 这将并发地对所有 .jpg 文件进行压缩,最多同时运行 4 个 gzip 进程。

# 示例7:使用 -0 处理包含空格的文件名
find . -name "*.txt" -print0 | xargs -0 rm
# 这将正确处理包含空格或特殊字符的文件名。

# 示例8:使用 -p 提示用户确认
find . -name "*.log" | xargs -p rm
# 这将在删除每个 .log 文件前提示用户确认。

# 示例9:使用 -t 显示即将执行的命令
find . -name "*.txt" | xargs -t rm
# 这将显示即将执行的 rm 命令。

3.3 综合示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#!/bin/bash

# 查找并删除所有 .tmp 文件
echo "Deleting all .tmp files:"
find . -name "*.tmp" | xargs -p rm

# 查找并复制所有 .jpg 文件到 backup 目录
echo "Copying all .jpg files to /backup/pictures/"
find . -name "*.jpg" | xargs -I {} cp {} /backup/pictures/

# 查找并压缩所有 .log 文件
echo "Compressing all .log files into logs.tar.gz:"
find . -name "*.log" | xargs tar -czvf logs.tar.gz

# 查找并重命名所有 .bak 文件为 .bak.old
echo "Renaming all .bak files to .bak.old:"
find . -name "*.bak" | xargs -I {} mv {} {}.old

# 查找并限制每次传递 2 个参数给 rm 命令
echo "Removing .txt files in batches of 2:"
find . -name "*.txt" | xargs -n 2 rm

# 查找并处理包含空格的文件名
echo "Handling filenames with spaces:"
find . -name "* *" -print0 | xargs -0 rm

# 查找并显示即将执行的命令
echo "Displaying commands before execution:"
find . -name "*.log" | xargs -t rm

四、awk 命令

4.1 awk 命令的基本用法

awk 是一种强大的文本处理工具,特别适用于处理结构化的文本数据;

1
awk [选项] '模式 { 操作 }' 文件名
  • [选项]:控制 awk 的行为。
  • 模式:定义要处理的行。
  • 操作:对匹配的行执行的操作。
  • 文件:要处理的文件列表。

常用选项

  • -F:指定字段分隔符。
  • -v:定义变量。
  • -f:从文件中读取 awk 脚本
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
# -F fs 或 --field-separator=fs:指定字段分隔符。
awk -F, '{print $1}' file.csv

# -v var=value:设置 awk 变量。
awk -v name="John" '{print "Hello, " name}' file.txt

# -f scriptfile:从文件中读取 awk 脚本。
awk -f script.awk file.txt

# 使用条件判断
awk '$3 > 100 { print $1 }' file.txt

# 使用变量
awk -v var="pattern" '$0 ~ var { print $0 }' file.txt

# 从文件中读取 awk 脚本
awk -f script.awk file.txt

4.2 内置函数

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# print:打印内容。
awk '{print $1, $2}' file.txt

# length(s):返回字符串 s 的长度。
awk '{print length($0)}' file.txt

# substr(s, m, n):返回字符串 s 从位置 m 开始的 n 个字符。
awk '{print substr($1, 1, 3)}' file.txt

# split(s, a, fs):将字符串 s 按分隔符 fs 分割到数组 a 中。
awk '{split($1, a, "-"); print a[1], a[2]}' file.txt

#match(s, r):在字符串 s 中匹配正则表达式 r。
awk '{if (match($1, /pattern/)) print $0}' file.txt

4.3 内置变量

  • FS:字段分隔符(默认为空白字符)。
  • OFS:输出字段分隔符(默认为空白字符)。
  • RS:记录分隔符(默认为换行符)。
  • ORS:输出记录分隔符(默认为换行符)。
  • NF:当前记录中的字段数。
  • NR:已处理的记录数(行号)。
  • FILENAME:当前处理的文件名
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# 按字段分隔符分割并打印特定字段
awk -F, '{print $1, $3}' data.txt

# 使用内置变量
awk '{print NR, FILENAME, NF, $0}' data.txt

#计算总和
awk '{print NR, FILENAME, NF, $0}' data.txt

# 过滤特定条件
awk -F, '$2 > 30 {print $1}' data.txt

# 使用正则表达式
awk '/Eng/' data.txt

# 使用自定义变量
awk -v prefix="Name:" '{print prefix, $1}' data.txt

# 使用内置函数
awk -F, '{print substr($1, 1, 3), length($1)}' data.txt

# 处理多文件
awk -F, '{print $1, $2}' data.txt more_data.txt

# 使用脚本文件
BEGIN {
    FS=","
    OFS="\t"
    print "Name\tAge\tOccupation"
}
{
    print $1, $2, $3
}
END {
    print "Total records processed:", NR

4.4 综合示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#!/bin/bash

# 打印每个员工的姓名和职业
echo "Employee Names and Occupations:"
awk -F, '{print $1, $3}' data.txt

# 计算所有员工的平均年龄
echo "Average Age:"
awk -F, '{sum += $2; count++} END {print sum/count}' data.txt

# 过滤出年龄大于30岁的员工
echo "Employees older than 30:"
awk -F, '$2 > 30 {print $1}' data.txt

# 使用正则表达式查找包含 "Dev" 的职业
echo "Employees with 'Dev' in their occupation:"
awk '/Dev/' data.txt

# 使用自定义变量前缀
echo "Employees with custom prefix:"
awk -v prefix="Name:" '{print prefix, $1}' data.txt

# 使用内置函数处理字符串
echo "First three letters of names and their lengths:"
awk -F, '{print substr($1, 1, 3), length($1)}' data.txt

# 处理多个文件
echo "Data from multiple files:"
awk -F, '{print $1, $2}' data.txt more_data.txt

# 使用脚本文件进行复杂处理
echo "Processed data using script.awk:"
awk -f script.awk data.txt