文本处理三剑客:sed、awk、grep

63 阅读1分钟

[toc]

一、sed

# 1.什么是sed?
    流式编辑器

# 2.为何要用sed?
    sed与vim对比
        1、sed可以把处理文件的规则事先写好。然后用一套规则编辑多个文件,而vim只能一个个编辑
        2、sed处理文件一次只处理一行,即同一时间内存中只有文件一行内容,无论文件多大,都不会对内存造成过大压力,

# 3.如何使用sed?
    sed 选项 "规则" 目标文件
        选项:
            -i        将默认输出结果(规则处理的结果+默认输出结果)输出到文件
            -n        取消默认输出
    规则:
        定位+命令
            定位:
                行号定位:
                    sed '1p' nn.txt      打印第一行
                    sed '3p;5p' nn.txt     打印第三行、第五行
                    sed '2,4p' nn.txt      打印第二到第四行
                正则定位:
                    sed '/12345/d' nn.txt        删除所有包含nn的行
                    sed '/^root/d' nn.txt         删除以root开头的行
                    sed '/12345$/d' nn.txt        删除以12345结尾的行
                没有定位就是定位所有

            命令:
                p          打印
                d          删除
# 4.示例
s///gi        替换(g全局  i不区分大小写)
sed '1,3s/root/jojo/gi' nn.txt          将第一到第三行的root替换为jojo
sed '/^ad/s/opkki/wwweee/gi' nn.txt      将所有以ad开头的行的opkki替换为wwweee
sed 's/^a/A/' nn.txt              将所有行行首的a替换为A
ip a | sed 's/eth0/jojo!!/'            sed命令支持管道

    i          在行前插入
    a          在行后插入

二、awk

主要擅长处理有规律的文本,主要用于做一下格式化的处理

awk 选项 '规则' 文件路径
    选项:
        -F        指定分隔符
    规则:
        定位+命令
            定位:
                行号定位:
                    (NR、NF表示变量,NR表示行号,  NF表示每行的段数量)
                    awk -F: 'NR == 3{print $1,$3}' a.txt      打印第三行的第一、第三段内容
                    awk -F: 'NR >= 2 && NR <= 4{print $2}' a.txt    打印第二到第四行的第二段内容
                    awk -F 'NR ==2 , NR == 4{print $0}' a.txt      打印第二到第四行的所有内容
                    awk -F 'NR <=2 || NR >=4{print $2,$4}      打印前两行与四行后的第二、四项内容
                正则定位:
                    awk -F: '$2 ~ /4/{print $0}' a.txt      打印第二段含有4的整行
                    awk -F: '$2 !~ /4/{print $0}' a.txt      打印第二段不含有4的整行
                    awk -F: '$1 == "we" {print $0}' a.txt     打印第一段是we的整行
                    awk -F: '$1 == "we"{print $NF}' a.txt      打印第一段是we的行的最后一段
                    awk -F: '/\/bin/{print $0}' a.txt        打印含有/bin的整行(使用右斜杠\取消左斜杠/的特殊含义)
                没有定位表示定位所有
            命令:
                {print $n}    打印第n行

三、grep

过滤

grep 选项 "过滤规则" 文件
    选项:
        -n      显示行号
        -i      忽略大小写
        -l      返回文件名
        -r      递归
        -v      取反
    过滤规则
        正则过滤

# 示例
grep -rl 'eth0' /etc/    查找/etc/下内容含有eth0的文件
 ```