在使用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]
# 越过 文件1
的 N1
个字节且越过 文件2
的 N2
个字节进行比较
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
【总结】
以上是对部分常用的[文件/文本处理命令]的不完全介绍,每个命令的所有选项及用法请以命令手册为准。
另外以上的介绍结合了本人自己的理解,如有错误的地方欢迎指出。