文本处理工具

Linux 下处理文本最常用的工具:find、grep、xargs、wc、sort、uniq、tr、cur、paste、diff、sed、awk;

find

查找文件的利器,是最常用的 Linux 命令;

grep

使用正则表达式查找匹配的字符串;

### 常用参数
# 模式:
# -G, --basic-regexp        基本正则(默认)
# -E, --extended-regexp     扩展正则(egrep)
# -P, --perl-regexp         Prel 正则
# -e, --regexp=PATTERN      指定多个正则模式时使用
# -f, --file=FILE           从文件中读取正则模式
# -i, --ignore-case         忽略大小写
# -w, --word-regexp         匹配单词
# -x, --line-regexp         匹配单行
#
# 杂项:
# -s, --no-messages         抑制错误信息
# -v, --invert-match        反向匹配
# 
# 输出:
# -m, --max-count=NUM       最多匹配 NUM 行
# -b, --byte-offset         显示字节偏移数
# -n, --line-number         显示所在行数
# -H, --with-filename       显示所属文件
# -h, --no-filename         不显示所属文件
# -o, --only-matching       显示匹配内容而不是整行
# -q, --quiet, --silent     抑制所有正常输出
# -d, --directories=ACTION  定义如何处理目录:read|recurse|skip
# -D, --devices=ACTION      定义如何处理设备文件/管道文件/套接字文件:read|skip
# -r, --recursive           等同于 '--directories=recurse'
# -R, --dereference-recursive   同 -r,但是会跟随符号链接
#     --include=FILE_PATTERN    只查找与模式相匹配的文件
#     --exclude=FILE_PATTERN    跳过与模式相匹配的文件和文件夹
#     --exclude-from=FILE       跳过与模式相匹配的文件
#     --exclude-dir=PATTERN     跳过与模式相匹配的文件夹
# -l, --files-with-matches  打印匹配的文件,而非文件内容
# -L, --files-without-match 打印不匹配的文件,而非文件内容
# -c, --count               打印匹配到的行数,而非文件内容
# -T, --initial-tab         使用 tab 分隔输出项
#     --color[=WHEN]        高亮显示匹配项:always|never|auto
# 
# 上下文:
# -B, --before-context=NUM  打印匹配行的前 NUM 行
# -A, --after-context=NUM   打印匹配行的后 NUM 行
# -C, --context=NUM         打印匹配行的前后 NUM 行
# -NUM                      等同于 '--context=NUM'

### 命令举例
grep -i 'nginx' /etc/passwd                     # 查找 nginx 用户
ls -l /etc/ | grep -v '^total' | grep -c '^d'   # 统计有多少个目录

xargs

xargs 是给其他命令传递命令行参数的过滤器,擅长分割命令行参数,并将其传递给对应命令;
xargs 默认从标准输入中读取数据,然后进行参数处理;使用 -a 参数可让 xargs 从文件中读取;
如果没有指定要执行的命令,则 xargs 默认将其传递给 echo,而 echo 会将传递的参数打印出来。

### 常用参数
# -a, --arg-file=FILE          从文件中读取输入参数,而非标准输入
# -d, --delimiter=CHARACTER    指定输入参数的分割符,默认为空白符(多个空格合并)
# -i, --replace[=R]            指定参数替换符,如果指定为空,默认为 '{}'
# -I R                         等同于 '--replace=R'
# -n, --max-args=MAX-ARGS      每次给 COMMAND 传递 MAX-ARGS 个参数,默认传递全部
# -P, --max-procs=MAX-PROCS    同时启动 MAX-PROCS 个 COMMAND 进程,默认为 1,如果为 0,则启动尽可能多的进程
# -p, --interactive            在运行 COMMAND 命令前提示用户
# -r, --no-run-if-empty        如果参数为空,则不执行 COMMAND,默认至少执行一次
# -t, --verbose                在执行 COMMAND 命令前打印要执行的命令及参数

### 命令举例
echo '1;2;3;4;5' | xargs -d';' -n1
1
2
3
4
5

# 批量执行命令 - 软链接
# root @ arch in ~ [14:01:32]
$ ls

# root @ arch in ~ [14:01:33]
$ mkdir dist

# root @ arch in ~ [14:01:36]
$ touch lib{A..G}.so

# root @ arch in ~ [14:01:38]
$ ls
dist  libA.so  libB.so  libC.so  libD.so  libE.so  libF.so  libG.so

# root @ arch in ~ [14:01:39]
$ ls | grep '\.so' | xargs -n1 -i'ARG' ln -sf $(pwd)/ARG dist/ARG

# root @ arch in ~ [14:02:05]
$ ls
dist  libA.so  libB.so  libC.so  libD.so  libE.so  libF.so  libG.so

# root @ arch in ~ [14:02:08]
$ ll dist
total 0
lrwxrwxrwx 1 root root 13 Nov 22 14:02 libA.so -> /root/libA.so
lrwxrwxrwx 1 root root 13 Nov 22 14:02 libB.so -> /root/libB.so
lrwxrwxrwx 1 root root 13 Nov 22 14:02 libC.so -> /root/libC.so
lrwxrwxrwx 1 root root 13 Nov 22 14:02 libD.so -> /root/libD.so
lrwxrwxrwx 1 root root 13 Nov 22 14:02 libE.so -> /root/libE.so
lrwxrwxrwx 1 root root 13 Nov 22 14:02 libF.so -> /root/libF.so
lrwxrwxrwx 1 root root 13 Nov 22 14:02 libG.so -> /root/libG.so

wc

wc 通常用来统计文件的行数、单词数、字节数、字符数;

### 常用参数
# -c, --bytes            统计字节数
# -m, --chars            统计字符数
# -w, --words            统计单词数(空格分开)
# -l, --lines            统计行数
# -L, --max-line-length  最长行的字节数

# 如果不指定文件,则从标准输入读取数据

### 命令举例
ll /etc/ | grep -v '^total' | wc -l     # 统计文件(夹)数目

sort

sort 将文件的每一行作为一个单位,相互比较,比较原则是从首字符向后,依次按 ASCII 码值进行比较,最后将它们按升序输出;

uniq

uniq 即 unique,独一无二的,不重复的;通常和 sort 一并使用;

### 常用参数
# -i, --ignore-case     忽略大小写
# -c, --count           显示相同行的数目
# -u, --unique          打印未重复行
# -d, --repeated        打印重复行
# -D                    打印所有重复行

### 命令举例
sort test.txt | uniq    # 消除重复行
sort test.txt | uniq -c # 统计重复行出现次数
sort test.txt | uniq -d # 找出重复行

tr

tr 即 translate,翻译、转换;tr 只处理标准输入,如果需要处理文件请使用重定向;

tr [OPTION]... SET1 [SET2]
### 常用参数
# -c, -C, --complement    使用 SET1 的补码(即不在集合中的字符)
# -d, --delete            删除 SET1 中的字符
# -s, --squeeze-repeats   合并连续的重复字符,在合并多个空格时很有用,此时 SET2 无效
#
# SET 集合:
# \\              反斜杠
# \a              响铃
# \b              退格
# \r              回车
# \n              换行
# \f              换页
# \t              水平制表
# \v              垂直制表
# \NNN            八进制数字(1~3 位)
# CHAR1-CHAR2     字符/数字范围
# [:alpha:]       字母
# [:digit:]       数字
# [:alnum:]       字母 + 数字
# [:lower:]       小写字母
# [:upper:]       大写字母
# [:cntrl:]       控制符
# [:print:]       可打印字符,包括空格
# [:graph:]       可显示字符,不包括空格
# [:punct:]       标点符号
# [:blank:]       空白符
# [:space:]       水平或垂直空白
# [:xdigit:]      十六进制数字

### 命令举例
tr 'a-z' 'A-Z' < test.txt   # 大小写转换
tr ' ' '\t' < test.txt      # 空格转换为 tab
tr -s ' ' ' ' < test.txt    # 合并连续空格
tr -d ' ' < test.txt        # 删除所有空格

cut

cut 的工作就是”剪”,就是在文件中负责裁剪数据;cut 是以每一行为一个处理对象的;
cut 一般以什么为依据呢?也就是说,我怎么告诉 cut 我想定位到的剪切内容呢?三种方式:

  • 字节 byte:选项 -b
  • 字符 char:选项 -c
  • 字段 field:选项 -f

paste

这个很简单,和 cut 的原理几乎一样,就是将几个文件的相应行用制表符连接起来,并打印至标准输出;

# root @ arch in ~ [16:07:24]
$ cat a
1
2
3

# root @ arch in ~ [16:07:26]
$ cat b
a
b
c

# root @ arch in ~ [16:07:27]
$ paste a b
1    a
2    b
3    c

# root @ arch in ~ [16:07:36]
$ paste a b | sed -n l
1\ta$
2\tb$
3\tc$

# root @ arch in ~ [16:07:56]
$ paste -d':' a b
1:a
2:b
3:c

# root @ arch in ~ [16:08:24]
$ paste -d':' -s a b
1:2:3
a:b:c

column

文本格式化工具(创建表),先看看怎么用:

对比前后的输出,明显后面的更易阅读,这就是 column 的用途,常用参数:

  • -t:创建一个表,然后输出(常用)
  • -s sep:输入中列与列之间的分隔符,默认空白符
  • -o str:输出中列与列之间的分隔符,默认两空格

diff

文本比较工具,一般我使用 git 比较多,对此比较熟悉;

sed

sed 详解

awk

awk 详解