文章目录
文本处理器 2
本章讲解 grep
、sort
、uniq
、tr
、cut
、split
、paste
命令等。这些文本处理器通常用于数据过滤、转换、清理、格式化和提取等操作,是 Shell 脚本编程和数据处理任务中的核心工具。在 Unix/Linux 系统中,文本处理器可以独立使用,也可以通过管道 |
进行组合,构成强大的文本处理流水线。
cut 命令-快速裁剪
cut
命令用于对字段进行截取和剪裁。
语法格式
cut [选项] 参数
可使用管道传递,如:cat file | cut [选项]
常用选项
- -d:指定分隔符(默认分隔符为 Tab)。
- -f:按字段进行截取,指定第n个字段(-f空格n)。
- -b:以字节为单位进行截取。
- -c:以字符为单位进行截取。
- -complement:排除所指定的字段。
- -output-delimiter:更改输出内容的分隔符。
示例
cut -d ':' -f 1-3 /etc/passwd
# 指定 ":" 作为分隔符,输出第1到第3个字段
# 参数单双引号都可以
head -n 2 /etc/passwd | cut -d ':' --complement -f 2
# 删除第2个字段
head -n 2 /etc/passwd | cut -d ':' -f 1-5 --output-delimiter='@'
# 将分隔符转换为 @ ,进行输出
split 命令-文件拆分
split
命令用于将大文件拆分为若干小文件。
语法格式
split [选项] 参数 原始文件 拆分后文件名前缀
常用选项
- -l:指定行数。
- -b:指定文件的大小。
示例
split -l 20 test2.txt sc # 按每20行拆分
split -b 2m httpd-2.4.29.tar.bz2 sc # 按大小拆分
paste 命令-文件合并
paste
命令用于按照字段合并文件内容。
语法格式
paste [选项] 文件1 文件2
常用选项
- -d:指定文件的分隔符(默认情况下为制表符 “\n”)。
- -s:将列和行的内容进行互相交换。
示例
paste -d ',' file1 file2 # 按 ',' 分隔符合并文件
paste -s file1 # 将列和行的内容互相交换
注意:paste
和 cat
的区别
-
paste a b
是左右合并,按列合并文件内容。 -
cat a b
是上下合并,按行合并文件内容。示例:
**文件a 文件b paste a b 结果 cat a b结果** 1 A 1 A 1 2 B 2 B 2 3 C 3 C 3 A B C
eval 命令-变量扫描器
eval
是一个 Shell 内置命令,用于对命令行进行两次扫描和替换,然后再执行命令。常用于那些一次扫描无法实现功能,需要二次处理的变量。
工作原理
- 在执行命令之前,Shell 通常会对命令行进行一次扫描,执行变量替换、命令替换等操作。
eval
会将命令行再扫描一遍,进行所有的置换,然后执行。这使得eval
适用于需要进行两次扫描才能实现其功能的变量。
示例
#!/bin/bash
# 这是一个验证 eval 扫描的脚本
a=100
b=a
echo "普通 echo 输出的变量 b 的值为:" \$$b
eval echo "经过 eval 扫描输出变量 b 的值为:" \$$b
解释
-
使用普通的
echo
输出变量b
的值:echo "普通 echo 输出的变量 b 的值为:" \$$b
\$$b
在第一次扫描时会被替换为$a
。- 输出结果是:
普通 echo 输出的变量 b 的值为: $a
。
-
使用
eval
对变量进行两次扫描:eval echo "经过 eval 扫描输出变量 b 的值为:" \$$b
eval
会先将\$$b
替换为$a
,然后再执行第二次扫描,将$a
替换为100
。- 输出结果是:
经过 eval 扫描输出变量 b 的值为: 100
。
输出结果
普通 echo 输出的变量 b 的值为: $a
经过 eval 扫描输出变量 b 的值为: 100