linux文本处理常用命令
linux文本处理常用命令
grep
- 基础筛选关键字
1 | grep "error" log.txt |
- 忽略大小写
1 | grep -i "error" log.txt |
- 显示行号
1 | grep -n "fail" log.txt |
- 递归搜索目录
1 | grep -r "OCPP" ./ |
- 反选(排除)
1 | grep -v "DEBUG" log.txt |
- 显示匹配行的前后上下文
1 | grep -C 5 "ERROR" log.txt # 前后各5行 |
- 统计匹配次数
1 | grep -c "ERROR" log.txt |
- 只打印匹配部分(提取字段/ID)
1 | grep -o "ID=[0-9]\+" log.txt |
- 使用扩展正则(少打反斜杠)
1 | grep -E "ERROR|WARN" log.txt |
- 精确匹配整词(避免误匹配)
1 | grep -w "fail" log.txt |
- 固定字符串匹配
-F避免输入的文本被当做正则表达式进行解析:
1 | grep -F "literal.text[1]" log.txt |
sed
- 字符串替换(全局)
1 | sed 's/old/new/g' file.txt |
- 只替换第3行
1 | sed '3s/old/new/' file.txt |
- 删除空行
1 | sed '/^$/d' file.txt |
- 删除第1到5行
1 | sed '1,5d' file.txt |
- 原地修改文件(谨慎使用)
1 | sed -i 's/foo/bar/g' file.txt |
- 带备份的原地替换(更安全)
1 | sed -i.bak 's/foo/bar/g' file.txt |
- 打印第 N 行
1 | sed -n '10p' file.txt |
- 只替换首次出现(每行仅第1个)
1 | sed 's/foo/bar/' file.txt |
- 去掉行尾空白
1 | sed 's/[[:space:]]\+$//' file.txt |
awk
- 按列输出
1 | awk '{print $1,$3}' file.txt |
- 指定分隔符(CSV)
1 | awk -F, '{print $2}' data.csv |
- 条件过滤
筛选出“第3列大于100”的所有行并输出:
1 | awk '$3 > 100 {print}' file.txt |
- 统计行数
1 | awk 'END{print NR}' file.txt |
- 求和统计
把第2列所有数字加起来,最后输出总和:
1 | awk '{sum+=$2} END{print sum}' data.txt |
- 打印行号 + 整行
1 | awk '{print NR, $0}' file.txt |
- 指定输出分隔符
1 | awk 'BEGIN{OFS=","} {print $1,$3}' file.txt |
- 按条件统计行数
1 | awk '$3>100 {cnt++} END{print cnt}' file.txt |
- 求平均值
1 | awk '{sum+=$2; n++} END{if(n>0) print sum/n; else print 0}' data.txt |
cut
- 按空格切列
1 | cut -d' ' -f1 file.txt |
- 按冒号分隔
只显示使用冒号分割的内容的第一列:
1 | cut -d: -f1 /etc/passwd |
- 提取第2到4列
1 | cut -d',' -f2-4 data.csv |
- 按字符位置截取
截取每一行的第 1 到第 10 个字符并输出:
1 | cut -c1-10 file.txt |
- 输出“除了第1列之外”的剩余列
1 | cut -d, -f2- data.csv |
sort
- 默认排序
默认排序规则:每行数据,从第1个字符开始比较,按字符的ASCII码顺序,逐字符比较
1 | sort file.txt |
- 数字排序
1 | sort -n data.txt |
- 反向排序
1 | sort -r file.txt |
- 去重排序
1 | sort -u file.txt |
- 按指定列排序(指定分隔符+列范围)
按逗号分列,先按第2列排序(字符串),如果第2列相同,再按第3列做数字排序:-t,表示用逗号作为分隔符-k2,2表示用 第2列 → 第2列 作为排序键,即按第2列排序-k3,3n表示用 第3列 → 第3列 作为排序键,即按第3列排序,并且做数字排序
1 | sort -t, -k2,2 -k3,3n data.csv |
- 指定分隔符/按指定列排序
用冒号分列,从第 2 列开始,一直到最后一列,作为排序键,并按数字排序:-t:表示用冒号作为分隔符-n表示数字排序
1 | sort -t: -k2,2n log_data.txt |
假设文本内容是:1
2
3
4DataType: 2
TotalCount: 127
TotalPages: 3
CurrentPage: 0
排序之后的结果是:1
2
3
4CurrentPage: 0
DataType: 2
TotalPages: 3
TotalCount: 127
- 使用稳定排序(多关键字排序时建议)
1 | sort -s -k1,1 -k2,2n file.txt |
uniq
- 去重(需先排序)
1 | sort file.txt | uniq |
- 统计重复次数
1 | sort file.txt | uniq -c |
- 只显示重复行
1 | sort file.txt | uniq -d |
- 只显示唯一行(不重复的行)
1 | sort file.txt | uniq -u |
wc
- 统计行数
1 | wc -l file.txt |
- 统计单词数
1 | wc -w file.txt |
- 统计字符数
1 | wc -c file.txt |
tail
- 查看最后10行
1 | tail file.txt |
- 实时查看日志
1 | tail -f log.txt |
- 查看最后100行
1 | tail -n 100 log.txt |
- 从第 N 行开始输出到末尾
1 | tail -n +100 file.txt |
head
- 查看前10行
1 | head file.txt |
- 查看前50行
1 | head -n 50 file.txt |
tr
- 小写转大写
1 | echo abc | tr a-z A-Z |
- 删除指定字符
1 | tr -d '\r' < file.txt |
- 压缩重复字符
把连续出现的多个空格,压缩成一个空格:
1 | tr -s ' ' < file.txt |
- 统一 Windows 换行符
1 | tr -d '\r' < file.txt > file_unix.txt |
- 替换 Tab 为单个空格
1 | tr '\t' ' ' < file.txt |