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
    4
    DataType: 2
    TotalCount: 127
    TotalPages: 3
    CurrentPage: 0

    排序之后的结果是:

    1
    2
    3
    4
    CurrentPage: 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
  • 查看前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