文本处理工具与正则表达式

内容目录

文本编辑工具之初识 Vim

Vim 是 Linux 下常见的终端文本编辑器,其主要模式有:

  • 普通模式:浏览与命令模式,按 Esc 进入;
  • 编辑模式:输入文本,按 i 进入;
  • 命令模式:执行保存、退出、替换等命令,按 : 进入。

常见操作命令

命令说明
i插入模式,在光标前输入
a插入模式,在光标后输入
x删除光标所在字符
:w保存文件
:q退出
:wqZZ保存并退出
:q!强制退出不保存

查找与替换

:/pattern     # 查找 pattern
:%s/foo/bar/g # 全文替换 foo 为 bar

文本处理核心工具

文件内容查看

  • cat:查看完整内容;
  • more:分页向下查看;
  • less:可上下滚动查看,推荐;
  • head:查看前 N 行,如 head -n 10 file.txt
  • tail:查看后 N 行,如 tail -n 20 log.txt
  • nl:显示行号;
  • wc:统计字数、行数等,常见参数:
    • -l 行数;
    • -w 单词数;
    • -c 字节数。

文件内容截取

  • cut:按列截取内容
cut -d ':' -f1 /etc/passwd  # 使用冒号分隔,取第1列
  • split:分割大文件;
  • paste:按列合并多个文件;
  • sort:排序,可与 -n (数值) -r (倒序) -k (按列) 配合;
  • uniq:去重,常与 sort 配合;
  • tr:字符替换或删除,如:
echo "abc" | tr 'a-z' 'A-Z'

文本比较工具

  • diff file1 file2:比较两个文件差异
  • cmp file1 file2:按字节比较,适合二进制
  • comm file1 file2:比较两个排序文件的异同

正则表达式基础(基础/扩展)

基本元字符

字符含义
.匹配任意单个字符
^匹配行首
$匹配行尾
*匹配前一个字符 0 次或多次
[]匹配字符集合,例如 [abc] 匹配 a 或 b 或 c
[^abc]匹配除 abc 外的任意字符
\转义字符
{n} / {n,} / {n,m}匹配 n 次、至少 n 次、n 到 m 次

拓展元字符(使用 grep -E / egrep

字符含义
+匹配前一个字符一次或多次
?匹配前一个字符 0 次或 1 次
``
()分组匹配

grep 工具:文本搜索利器

grep [选项] '模式' 文件

常用参数

  • -i:忽略大小写
  • -v:显示不匹配的行
  • -n:显示行号
  • -r-R:递归搜索
  • --color=auto:高亮匹配

示例:

grep -i "error" /var/log/syslog

sed 工具:文本编辑器(非交互)

Sed 是“流编辑器”,用于按行读取、修改、输出文本。

常用语法

sed [选项] '地址 命令' 文件

示例命令

sed -n '2p' file     # 只打印第2行
sed 's/foo/bar/g' file  # 全文替换 foo 为 bar
sed -e '1d' file     # 删除第1行
sed -e '/^$/d' file  # 删除空行

awk 工具:按字段处理文本

Awk 是功能强大的文本处理语言,按列/字段读取。

基本语法

awk '模式 {动作}' 文件

常用变量

  • $0:整行
  • $1:第1列
  • NR:当前行号
  • NF:当前行字段数

示例:

awk -F ':' '{print $1}' /etc/passwd   # 打印用户名
awk '{print $1, $3}' file             # 打印第1列和第3列

重定向与管道

标准输入输出

  • >:输出重定向(覆盖)
  • >>:追加输出
  • <:输入重定向
echo "hello" > out.txt
cat < in.txt

错误重定向

  • 2>:错误输出
  • 2>&1:合并输出和错误
command > out.txt 2>&1

管道 |

把前一个命令的输出作为下一个命令的输入。

cat file | grep "error" | wc -l

通配符总结

符号含义
*匹配任意字符(包括空)
?匹配任意单个字符
[]匹配指定范围内的任意一个字符
[!abc]匹配不包含 abc 的任意字符

示例:

ls *.txt      # 匹配所有 txt 文件
ls file?.sh   # 匹配 file1.sh, file2.sh 等
ls [a-c]*     # 匹配以 a~c 开头的文件