# Shell 文本处理工具集

包含：

```
find、grep、xargs、sort、uniq、tr、cut、paste、wc、sed、awk；
```

## 01 find 文件查找

1 查找txt和pdf文件

```
find . ( -name "*.txt" -o -name "*.pdf" ) -print
```

2 正则方式查找.txt和pdf

```
find . -regex  ".*(.txt|.pdf)$"
```

-iregex： 忽略大小写的正则

3 否定参数

查找所有非txt文本

```
find . ! -name "*.txt" -print
```

4 指定搜索深度

打印出当前目录的文件（深度为1）

```
find . -maxdepth 1 -type f
```

5 定制搜索

按类型搜索：

```
find . -type d -print  //只列出所有目录-type f 文件 / l 符号链接
```

按时间搜索：

```
-atime 访问时间 (单位是天，分钟单位则是-amin，以下类似）
-mtime 修改时间 （内容被修改）
-ctime 变化时间 （元数据或权限变化）
```

最近7天被访问过的所有文件：

```
find . -atime 7 -type f -print
```

按大小搜索：

w字 k M G

寻找大于2k的文件

```
find . -type f -size +2k
```

按权限查找：

```
find . -type f -perm 644 -print //找具有可执行权限的所有文件
```

按用户查找：

```
find . -type f -user weber -print// 找用户weber所拥有的文件
```

6 找到后的后续动作

删除：

删除当前目录下所有的swp文件：

```
find . -type f -name "*.swp" -delete
```

执行动作（强大的exec）

```
find . -type f -user root -exec chown weber {} ; //将当前目录下的所有权变更为weber
```

注：{}是一个特殊的字符串，对于每一个匹配的文件，{}会被替换成相应的文件名；

eg：将找到的文件全都copy到另一个目录：

```
find . -type f -mtime +10 -name "*.txt" -exec cp {} OLD ;
```

7 结合多个命令

tips: 如果需要后续执行多个命令，可以将多个命令写成一个脚本。然后 -exec 调用时执行脚本即可；

```
-exec ./commands.sh {} ;
```

## 02 grep 文本搜索

```
grep match_patten file // 默认访问匹配行
```

常用参数:

* -o 只输出匹配的文本行 VS -v 只输出没有匹配的文本行
* -c 统计文件中包含文本的次数

```
grep -c "text" filename
```

* -n 打印匹配的行号
* -i 搜索时忽略大小写
* -l 只打印文件名

1 在多级目录中对文本递归搜索(程序员搜代码的最爱）：

```
grep "class" . -R -n
```

2 匹配多个模式

```
grep -e "class" -e "vitural" file
```

3 grep输出以作为结尾符的文件名：（-z）

```
grep "test" file* -lZ| xargs -0 rm
```

4 xargs 命令行参数转换

## 08 wc 统计行和字符的工具

```
wc -l file // 统计行数
wc -w file // 统计单词数
wc -c file // 统计字符数
```

## 09 sed 文本替换利器

移除空白行：

```
sed '/^$/d' file
```

## 10 awk 数据流处理工具

awk脚本结构

```
awk ' BEGIN{ statements } statements2 END{ statements } '
```

工作方式

1.执行begin中语句块；

2.从文件或stdin中读入一行，然后执行statements2，重复这个过程，直到文件全部被读取完毕；

3.执行end语句块；

print 打印当前行

使用不带参数的print时，会打印当前行;

```
echo -e "line1 line2" | awk 'BEGIN{print "start"} {print } END{ print "End" }'
```

print 以逗号分割时，参数以空格定界;

```
echo | awk ' {var1 = "v1" ; var2 = "V2"; var3="v3";print var1, var2 , var3; }'$>v1 V2 v3
```

使用-拼接符的方式（""作为拼接符）;

```
echo | awk ' {var1 = "v1" ; var2 = "V2"; var3="v3";print var1"-"var2"-"var3; }'$>v1-V2-v3
```

特殊变量： `NR NF $0 $1 $2`

* NR:表示记录数量，在执行过程中对应当前行号；
* NF:表示字段数量，在执行过程总对应当前行的字段数；
* * $0:这个变量包含执行过程中当前行的文本内容；
  * $1:第一个字段的文本内容；
  * $2:第二个字段的文本内容；

```
echo -e "line1 f2 f3 line2 line 3" | awk '{print NR":"$0"-"$1"-"$2}'

//1:line1 f2 f3 line2 line 3-line1-f2
```

打印每一行的第二和第三个字段：

```
awk '{print $2, $3}' file
```

统计文件的行数：

```
awk ' END {print NR}' file
```

累加每一行的第一个字段：

```
echo -e "1 2 3 4 " | awk 'BEGIN{num = 0 ;print "begin";} {sum +=$0+ $1+$2+$3;} END {print "=="; print sum }'
begin
==
7
```

传递外部变量

```
var=1000
echo | awk '{print vara}' vara=$var #  输入来自stdin
awk '{print vara}' vara=$var file # 输入来自文件

//
(base) jiang@jiangxinfadeAir Documents % var=1000
(base) jiang@jiangxinfadeAir Documents % echo | awk '{print vara}' vara=$var
1000
```

用样式对awk处理的行进行过滤

```
awk 'NR < 5' #行号小于5
awk 'NR==1,NR==4 {print}' file #行号等于1和4的打印出来
awk '/linux/' #包含linux文本的行（可以用正则表达式来指定，超级强大）
awk '!/linux/' #不包含linux文本的行
```

使用-F来设置定界符（默认为空格）

```
awk -F: '{print $NF}' /etc/passwd

cat /etc/passwd |awk  -F ':'  '{print $1}'

cat /etc/passwd |awk  -F ':'  '{print $1"\t"$7}'
root    /bin/bash
daemon  /bin/sh
bin     /bin/sh
sys     /bin/sh
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://im-qianuxn.gitbook.io/pytorch/ji-suan-ji/shell-linux/wen-ben-chu-li.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
