Skip to content

文本处理

cat 高级用法

合并文件

bash
cat file1 file2 > merged.txt
cat *.txt > all.txt
cat file1 >> file2              # 追加

显示特殊字符

bash
cat -A file1                    # 显示所有特殊字符
cat -T file1                    # 显示 Tab 为 ^I
cat -E file1                    # 显示行尾为 $
cat -v file1                    # 显示非打印字符

sed - 流编辑器

基本语法

bash
sed [options] 'command' file
sed [options] -f script_file file

替换操作

bash
sed 's/old/new/' file1          # 替换每行第一个匹配
sed 's/old/new/g' file1         # 替换所有匹配
sed 's/old/new/2' file1         # 替换每行第2个匹配
sed 's/old/new/gi' file1        # 忽略大小写
sed 's/old/new/' file1 > output # 输出到文件
sed -i '' 's/old/new/g' file1   # 直接修改文件(macOS 语法)
sed -i '.bak' 's/old/new/g' file1  # 修改前备份

指定行操作

bash
sed '3s/old/new/' file1         # 只处理第3行
sed '1,5s/old/new/' file1       # 处理1-5行
sed '5,$s/old/new/' file1       # 处理第5行到末尾
sed '/pattern/s/old/new/' file1 # 只处理匹配行
sed '/start/,/end/s/old/new/' file1  # 处理区间

删除操作

bash
sed '3d' file1                  # 删除第3行
sed '1,5d' file1                # 删除1-5行
sed '$d' file1                  # 删除最后一行
sed '/pattern/d' file1          # 删除匹配行
sed '/^$/d' file1               # 删除空行
sed '/^#/d' file1               # 删除注释行

插入和追加

bash
sed '3i\
new line' file1                 # 在第3行前插入
sed '3a\
new line' file1                 # 在第3行后追加
sed '$a\
new line' file1                 # 在末尾追加

打印操作

bash
sed -n '3p' file1               # 打印第3行
sed -n '1,5p' file1             # 打印1-5行
sed -n '/pattern/p' file1       # 打印匹配行
sed -n '/pattern/!p' file1      # 打印不匹配的行

多命令执行

bash
sed -e 's/old1/new1/' -e 's/old2/new2/' file1
sed 's/old1/new1/; s/old2/new2/' file1
sed -f script.sed file1

awk - 文本处理工具

基本语法

bash
awk 'pattern {action}' file
awk -F: '{print $1}' /etc/passwd    # 指定分隔符

打印字段

bash
awk '{print}' file1             # 打印整行
awk '{print $1}' file1          # 打印第1列
awk '{print $1, $3}' file1      # 打印第1和第3列
awk '{print $NF}' file1         # 打印最后一列
awk '{print $(NF-1)}' file1     # 打印倒数第2列
awk '{print NR, $0}' file1      # 打印行号和内容
awk '{print NF}' file1          # 打印字段数
awk -F: '{print $1}' /etc/passwd    # 以冒号分隔

条件匹配

bash
awk '/pattern/' file1           # 打印匹配行
awk '/pattern/{print $1}' file1 # 打印匹配行的第1列
awk '$3 > 100' file1            # 第3列大于100
awk '$3 == "value"' file1       # 第3列等于值
awk '$1 ~ /pattern/' file1      # 第1列匹配正则
awk '$1 !~ /pattern/' file1     # 第1列不匹配
awk 'NR >= 5 && NR <= 10' file1 # 第5-10行

内置变量

变量说明
$0整行内容
$1-$n第n个字段
NF字段数量
NR行号(所有文件)
FNR行号(当前文件)
FS字段分隔符
RS行分隔符
OFS输出字段分隔符
ORS输出行分隔符
FILENAME当前文件名
bash
awk -F: '{print NR, $1}' /etc/passwd
awk 'BEGIN{FS=":"; OFS="-"} {print $1, $3}' /etc/passwd
awk 'BEGIN{RS=""} {print}' file1    # 按空行分隔

计算与统计

bash
awk '{sum += $1} END {print sum}' file1       # 求和
awk '{sum += $1} END {print sum/NR}' file1    # 平均值
awk '{if($1>max) max=$1} END {print max}' file1
awk '{count[$1]++} END {for(k in count) print k, count[k]}' file1
awk '!seen[$0]++' file1         # 去重
awk '{a[NR]=$0} END{for(i=NR;i>=1;i--) print a[i]}' file1  # 反转行

格式化输出

bash
awk '{printf "%-10s %5d\n", $1, $2}' file1
awk '{printf "Name: %-15s Age: %3d\n", $1, $2}' file1

cut - 切割文本

按列切割

bash
cut -d: -f1 /etc/passwd         # 以冒号分隔,取第1列
cut -d: -f1,3 /etc/passwd       # 取第1和第3列
cut -d: -f1-3 /etc/passwd       # 取第1到第3列
cut -d: -f3- /etc/passwd        # 取第3列到最后

按字符切割

bash
cut -c1-5 file1                 # 取第1-5个字符
cut -c1,3,5 file1               # 取第1、3、5个字符
cut -c10- file1                 # 取第10个字符到最后

按字节切割

bash
cut -b1-10 file1                # 取前10个字节

sort - 排序

基本排序

bash
sort file1                      # 默认排序
sort -r file1                   # 反向排序
sort -n file1                   # 数字排序
sort -rn file1                  # 数字反向排序
sort -u file1                   # 排序并去重
sort -f file1                   # 忽略大小写

按字段排序

bash
sort -k2 file1                  # 按第2列排序
sort -k2,2n file1               # 按第2列数字排序
sort -k2,2nr file1              # 按第2列数字反向排序
sort -t: -k3,3n /etc/passwd     # 指定分隔符
sort -k1,1 -k2,2n file1         # 多字段排序

排序选项

选项说明
-n数字排序
-r反向排序
-u去重
-f忽略大小写
-t指定分隔符
-k指定排序字段
-b忽略前导空格
-M月份排序

uniq - 去重

bash
uniq file1                      # 去除连续重复行
sort file1 | uniq               # 排序后去重
uniq -c file1                   # 统计重复次数
uniq -d file1                   # 只显示重复行
uniq -u file1                   # 只显示不重复行
uniq -i file1                   # 忽略大小写
uniq -f 2 file1                 # 跳过前2个字段

wc - 统计

bash
wc file1                        # 行数、单词数、字节数
wc -l file1                     # 行数
wc -w file1                     # 单词数
wc -c file1                     # 字节数
wc -m file1                     # 字符数
wc -L file1                     # 最长行长度
wc *.txt                        # 统计多个文件

tr - 字符转换

字符替换

bash
tr 'a-z' 'A-Z' < file1          # 小写转大写
tr 'A-Z' 'a-z' < file1          # 大写转小写
tr 'abc' '123' < file1          # a->1, b->2, c->3

字符删除

bash
tr -d '0-9' < file1             # 删除数字
tr -d '\n' < file1              # 删除换行
tr -d '\r' < file1              # 删除回车
tr -d '\r\n' < file1            # 删除换行和回车

字符压缩

bash
tr -s ' ' < file1               # 压缩连续空格
tr -s '\n' < file1              # 压缩连续空行
tr -s 'a-z' < file1             # 压缩连续字母

字符集

bash
tr '[:lower:]' '[:upper:]' < file1  # 小写转大写
tr -d '[:digit:]' < file1           # 删除数字
tr -d '[:punct:]' < file1           # 删除标点

head/tail 高级用法

bash
head -n +10 file1               # 显示前10行
head -n -10 file1               # 不显示最后10行
head -c 100 file1               # 显示前100字节

tail

bash
tail -n +10 file1               # 从第10行开始显示
tail -f file1                   # 实时跟踪
tail -F file1                   # 跟踪(文件重建继续)
tail -f file1 | grep --line-buffered "error"

paste - 合并文件

bash
paste file1 file2               # 按行合并
paste -d: file1 file2           # 指定分隔符
paste -s file1                  # 所有行合并为一行
paste -s -d: file1 file2        # 每个文件合并为一行

join - 关联文件

bash
join file1 file2                # 按第一列关联
join -1 2 -2 1 file1 file2      # 指定关联列
join -t: -1 1 -2 2 file1 file2  # 指定分隔符
join -a1 file1 file2            # 显示所有file1的行
join -o 1.1,2.2 file1 file2     # 指定输出字段

column - 格式化输出

bash
column -t file1                 # 表格格式
column -t -s: /etc/passwd       # 指定分隔符
column -t -o '|' file1          # 指定输出分隔符

实用组合示例

日志分析

bash
grep "ERROR" app.log | awk '{print $1}' | sort | uniq -c | sort -rn
grep "2023-12-25" app.log | awk '{print $4}' | sort | uniq -c
awk '{print $1}' access.log | sort | uniq -c | sort -rn | head -10

文本处理

bash
sed 's/^/PREFIX:/' file1        # 行首添加
sed 's/$/SUFFIX/' file1         # 行尾添加
awk '{print NR": "$0}' file1    # 添加行号
sed '/^$/d' file1 | sed '/^#/d' # 删除空行和注释

数据统计

bash
awk '{sum+=$1} END{print "Sum:", sum, "Avg:", sum/NR}' file1
awk '{a[$1]+=$2} END{for(k in a) print k, a[k]}' file1
sort -k2 -n file1 | awk 'NR==1{min=$2} END{print "Min:", min, "Max:", $2}'

下一步学习