在使用Linux的过程中,最常做的操作就是对文件/文本进行一些处理。本文简单介绍下Linux中常用的文本处理命令,主要包括以下命令: find / grep / sort / cut / awk / sed / uniq / tee / tr / diff / cmp / split / xargs,下面依次介绍。

1. find

命令说明: 查找符合条件的文件,并执行指定的操作

命令格式: find [指定目录] [查找规则] [指定操作]

1.1 指定目录

[dir1 dir2] # 可以指定多个目录

1.2 查找规则

[-name] # 根据文件名查找 (区分大小写|支持通配符)
[-iname] # 根据文件名查找 (不区分大小写|支持通配符)
[-user] # 根据所属用户查找
[-group] # 根据所属用户组查找
[-nouser] # 查找无所属用户的文件
[-nogroup] # 查找无所属用户组的文件
[-uid] # 根据用户ID查找
[-gid] # 根据组ID查找
[-a] # AND 连接两个条件
[-o] # OR 连接两个条件
[-not] # NOT 对条件取反
[-atime -n/+n] # 按文件访问时间 (n天以内 / n天以前)
[-ctime -n/+n] # 按文件创建时间 (n天以内 / n天以前)
[-mtime -n/+n] # 按文件修改时间 (n天以内 / n天以前)
[-type f/d/l/b/c/p/s] # 按文件类型 (普通文件/目录文件/链接文件/块设备文件/字符设备文件/管道文件/socket文件)
[-size 2M/+2M/-2M] # 按文件大小 (等于2M / 大于2M / 小于2M)
[-perm 755] # 按文件权限 (755权限)

1.3 指定操作

{} # 代表找到的文件
[-print] # 查找后打印结果 (默认操作)
[-ls] # 查找后把结果列表显示
[-ok] # 查找后询问用户是否执行命令
[-exec] # 查找后不询问直接执行命令

1.4 举例说明

要求:查找 (/data/ 和 /www/) 目录下的后缀名为 (.php.sh) 且创建时间在 5天之内 的 普通文件 并 重命名。

# [命令1]
find /data/ /www/ -name "*.php" -o -name "*.sh" -ctime -5 -type f -exec mv {} {}.bak \;

说明:以上命令 [-exec] ,只会对满足 *.sh 规则的文件进行重命名操作,而忽略了 -o 条件查找出来的 *.php 文件,因此并不能满足要求,另外一定要注意命令结尾的空格和 \;

# [命令2]
find /data/ /www/ -name "*.php" -o -name "*.sh" -ctime -5 -type f | xargs -i mv {} {}.bak

说明:借助 xargs -i 命令满足了要求。这个命令后续会进行介绍。


2. grep

命令说明: 使用正则表达式来按行搜索文本

命令格式: grep [选项] [指定模式] [指定文件]

2.1 选项

[-c] # 计算符合条件的行数
[-i] # 不区分字符大小写
[-h] # 在显示匹配指定的模式的那一行之前不标示该行所属的文件名
[-H] # 在显示匹配指定的模式的那一行之前标示该行所属的文件名
[-l] # 列出文件内容匹配指定的模式的文件名
[-L] # 列出文件内容不匹配指定的模式的文件名
[-n] # 在显示匹配指定的模式的那一行前显示该行的行号
[-v] # 显示不匹配指定的模式的所有行
[-s] # 不显示错误信息

2.2 指定模式
正则表达式
2.3 指定文件
要查找的文件/支持多文件
2.4 举例说明
暂无

3. sort

命令说明: 对文本文件以行为单位按照指定的规则进行排序

命令格式: sort [选项] [指定文件]

3.1 选项

[-b] # 忽略每行前面的空格
[-c] # 检查文件是否已经按照顺序排序
[-f] # 排序时忽略大小写字母
[-M] # 将前3个字母按照月份的缩写进行排序
[-n] # 按照数值的大小进行排序
[-o new.txt] # 将排序后的结果存入指定文件 (new.txt)
[-r] # 以相反的顺序来排序
[-t ':'] # 指定排序时的栏位分隔符 (:)
[-k] # 选择以哪个区间进行排序 (与 -t 结合使用)
[-u] # 对排序结进行去重

3.2 指定文件
要进行排序的文件
3.3 举例说明
暂无

4. cut

命令说明: 对文本文件以行为单位按照字符/字节/片段进行分割并输出

命令格式: cut [-bn] [文件]cut [-c] [文件]cut [-df] [文件]

4.1 选项

[-b] # 以字节为单位进行分割
[-c] # 以字符为单位进行分割
[-d] # 自定义分隔符/默认为制表符
[-f] # 以哪个字段进行分割 (与 -d 结合使用)
[-n] # 取消分割多字节字符 (与 -b 结合使用 | 避免分割中文乱码)

4.2 按字节分割

cut [-bn] [文件]

4.3 按字符分割

cut [-c] [文件]

4.4 按片段分割

cut [-d ':' -f 1-n] [文件]

说明:以 : 为分隔符进行分割后输出指定的(第[1-n]个)片段

4.5 举例说明
暂无

5. awk

命令说明: awk 是一种编程语言,用于在 linux/unix 下对文本和数据进行处理。数据可以来自标准输入 (stdin) 、一个或多个文件,或其它命令的输出。它支持用户自定义函数和动态正则表达式等先进功能,是 linux/unix 下的一个强大编程工具。它在命令行中使用,但更多是作为脚本来使用。awk 有很多内建的功能,比如数组、函数等,这是它和C语言的相同之处,灵活性是 awk 最大的优势。


6. sed

命令说明: sed 是一种流编辑器,它是文本处理中非常中的工具,能够完美的配合正则表达式使用,功能不同凡响。处理时,把当前处理的行存储在临时缓冲区中,称为模式空间(pattern space),接着用 sed 命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。sed 主要用来自动编辑一个或多个文件,简化对文件的反复操作,编写转换程序等。


7. uniq

命令说明: 删除排序过的文件中的重复行 (与 sort 结合使用) 必须保证所有的重复行是相邻的

命令格式: uniq [选项] [输入文件] [输出文件]

7.1 选项

[-b] # 在输出行前加上该行在文件中出现的次数
[-d] # 仅显示重复的行
[-u] # 仅显示不重复的行
[-n] # 前n个字段与每个字段前的空白一起被忽略
[-f n] # 前n个字段与每个字段前的空白一起被忽略
[+n] # 前n个字符被忽略
[-s n] # 前n个字符被忽略
[-w n] # 指定要比较第n个字符

说明:一个字段是一个非空格、非制表符的字符串,彼此由制表符和空格隔开,字段从0开始编号,字符从0开始编号。

7.2 输入文件
要进行按行去重的文件
7.3 输出文件
去重后生成的文件
7.4 举例说明
暂无

8. tee

命令说明: 将数据重定向到指定文件并在屏幕上输出

命令格式: tee [选项] [指定文件]

8.1 选项

[-a] # 向文件中重定向时使用追加模式
[-i] # 忽略中断信号

8.2 指定文件
要保存输出的内容的文件
8.3 举例说明
暂无

9. tr

命令说明: 对来自标准输入的字符进行替换/压缩/删除

命令格式: tr [选项] [字符集1] [字符集2]

9.1 选项

[-c] # 取代所有不属于 字符集1 的字符
[-d] # 删除所有属于 字符集1 的字符
[-s] # 把连续重复的字符以单独的一个字符表示
[-t] # 先删除 字符集1字符集2 多出的字符

9.2 字符集1
指定要转换或删除的原字符集
9.3 字符集2
指定要转换成的目标字符集
9.4 举例说明
# 将大写字母转换为小写
echo 'PHPHA.COM' | tr 'A-Z' 'a-z'
# output: phpha.com

# 删除数字
echo '1PHPHa2.com3' | tr -d '0-9'
# output: PHPHa.com

# 替换连续重复的字符(s/n/空格)为一个指定的字符
echo 'thissss is    a text linnnne' | tr -s ' sn'
# output: this is a text line

10. diff

命令说明: 逐行对给定的两个文件进行比较

命令格式: diff [选项] [文件1] [文件2]

10.1 选项

[-a] # 将两个文件当做文本文件来处理
[-b] # 忽略空格
[-B] # 忽略空行
[-c] # 使用纲要输出格式
[-H] # 利用试探法加速大文件搜索
[-i] # 忽略大小写
[-u] # 以合并的方式来显示

10.2 举例说明
暂无

11. cmp

命令说明: 比较两个文件是否有差异

命令格式: cmp [选项] [文件1] [文件2]

11.1 选项

[-l] # 标示出所有不一样的地方
[-s] # 不显示错误信息
[-n N] # 设定比较的上限 (最多 N 个字节)
[-i N] # 越过开始的 N 个字节进行比较
[-i N1:N2] # 越过 文件1N1 个字节且越过 文件2N2 个字节进行比较

11.2 举例说明
暂无

12. split

命令说明: 将一个大文件分成多个小文件

命令格式: split [选项] [文件]

12.1 选项

[-b N] # 每个输出档案的大小 (N字节) / 即每个小文件的大小
[-d -a N] # 使用数字作为分割出的小文件的文件名后缀 / 数字长度为 N

12.2 举例说明
# 分割 [test.file] 为 10k 大小的小文件且以数字后缀来命名
[root@PHPHa ~]# split -b 10k test.file -d -a 3
[root@PHPHa ~]# ll
total 232
-rw-r--r-- 1 root root 102400 Sep  6 14:47 test.file
-rw-r--r-- 1 root root  10240 Sep  6 14:48 x000
-rw-r--r-- 1 root root  10240 Sep  6 14:48 x001
-rw-r--r-- 1 root root  10240 Sep  6 14:48 x002
-rw-r--r-- 1 root root  10240 Sep  6 14:48 x003
-rw-r--r-- 1 root root  10240 Sep  6 14:48 x004
-rw-r--r-- 1 root root  10240 Sep  6 14:48 x005
-rw-r--r-- 1 root root  10240 Sep  6 14:48 x006
-rw-r--r-- 1 root root  10240 Sep  6 14:48 x007
-rw-r--r-- 1 root root  10240 Sep  6 14:48 x008
-rw-r--r-- 1 root root  10240 Sep  6 14:48 x009

13. xargs

命令说明: 作为给其他命令传递参数的过滤器,也是组合多个命令的一个工具。它擅长将标准输入数据转换成命令行参数,xargs 能够处理管道或者stdin 并将其转换成特定命令的命令参数。xargs 也可以将单行或多行文本输入转换为其他格式,例如多行变单行,单行变多行。

命令格式: xargs [选项]

13.1 选项

[-n N] # 指定每行的最大列数 (N) 以多行输出
[-d ':'] # 定义一个定界符 (:)
[-I '{}'] # 指定一个替换字符串 ({})

13.2 举例说明
# 测试文件
[root@PHPHa ~]# cat test.txt 
a b c d e f g
h i j k
l m n

# 多行输出
[root@PHPHa ~]# cat test.txt | xargs -n 4
a b c d
e f g h
i j k l
m n

# 定界符
[root@PHPHa ~]# echo "PHP:MySQL:Redis" | xargs -d ":"
PHP MySQL Redis

# 替换字符串的使用
[root@PHPHa ~]# ll
total 4
-rw-r--r-- 1 root root   28 Sep  6 14:58 test.txt
[root@PHPHa ~]# find . -name '*.txt' -type f | xargs rm -f {}
[root@PHPHa ~]# ll
total 0

【总结】

以上是对部分常用的[文件/文本处理命令]的不完全介绍,每个命令的所有选项及用法请以命令手册为准。

另外以上的介绍结合了本人自己的理解,如有错误的地方欢迎指出。

标签:Linux