Appearance
文本处理
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 file1awk - 文本处理工具
基本语法
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}' file1cut - 切割文本
按列切割
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 高级用法
head
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}'