Linux三剑客 sed 取行和替换 修改文本 选项
1 2 3 -i :直接修改文件内容; -n :只打印模式匹配的行; -e 多次编辑
参数
1 2 3 4 5 6 7 8 9 10 11 a\ 在当前行下面插入文本; sed '1a test' 1.txt i\ 在当前行上面插入文本; sed '1i test' 1.txt c\ 把选定的行改为新的文本; sed '1c test' 1.txt d 删除,删除选择的行; sed '1d' 1.txt s 替换指定字符; sed 's/test/test2/' 1.txt # 替换一次 # s/查找的内容/替换的内容/g s表示替换 g表示全局,///可以替换成
替换标记
1 2 3 g 表示行内全面替换; sed 's/test/test2/g' 1.txt # 替换全部 p 表示打印行;
元字符集
1 2 3 4 5 6 ^ #匹配行开始,如:/^sed/匹配所有以sed开头的行; $ . #匹配一个非换行符的任意字符,如:/s.d/匹配s后接一个任意字符,最后是d; * #匹配0个或多个字符,如:/*sed/匹配所有模板是一个或多个空格后紧跟sed的行; [] #匹配一个指定范围内的字符,如/[ss]ed/匹配sed和Sed; [^] #匹配一个不在指定范围内的字符,如:/[^A-RT-Z]ed/匹配不包含A-R和T-Z的一个字母开头,紧跟ed的行;
awk 取列 处理文本 awk完整语法 1 awk 'BEGIN {commands} pattern {commands} END{commands}' file1
BEGIN:处理数据前执行的命令 END:处理数据后执行的命令 pattern:模式,每一行都执行的命令 BEGIN和END里的命令只是执行一次 pattern里的命令会匹配每一行去处理
预定义变量 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 $ 0 : 代表当前行(相当于匹配所有) awk -F: '{print $0, "---"}' /etc/passwd $ n : 代表第n列 案例1:(以:为分隔符) awk -F: '{print $1}' /etc/passwd root daemon NF : 记录当前统计总字段数 案例1:(以:为分隔符 统计文件内每行内的字段数) awk -F: '{print NF}' /etc/passwd 案例2:(以:为分隔符 打印最后的字段) awk -F: '{print $NF}' /etc/passwd NR : 用来记录行号 案例1: awk -F: '{print NR}' /etc/passwd FS : 指定文本内容分隔符(默认是空格) 案例1: awk 'BEGIN{FS=":"}{print $NF, $1}' /etc/passwd 解析: BEGIN{FS=":"} : 相当于指定以 : 为分隔符 $ NF : 存储以 : 分隔符的最后一列 $ 1 : 存储以 : 分隔符的第一列 print : 打印 OFS : 指定打印分隔符(默认空格) 案例1:(输出的意思 分隔符会打印出来) awk -F: 'BEGIN{OFS=" >>> "}{print $NF, $1}' /etc/passwd FS 的优先级要高于 -F 解析: BEGIN{OFS=" >>> "} : 指定打印分隔符 $ NF : 存储以 >>> 分隔符的最后一列 $ 1 : 存储以 >>> 分隔符的第一列 print : 打印
比较表达式 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 > : 小于 < : 大于 > = : 小于等于 <= : 大于等于 ~ : 正则匹配(包含) !~ : 正则匹配(不包含) 案例1: 要求打印属组ID大于属主ID的行 awk -F: '$4 > $3{print $0}' /etc/passwd 解析: $ 4 : 代表属组所在列 $ 3 : 代表属主所在列 $ 0 : 所有行 案例2: 打印结尾包含bash awk -F: '$NF ~ /bash/{print $0}' /etc/passwd 解析: $ NF ~ /bash/ :尾部最后一列 包含 bash 的行 ~ : 包含 a案例3: 打印结尾不包含bash awk -F '$NF !~ /bash/{print $0}' /etc/passwd 解析: !~ : 不包含 (将打印其他内容)
条件表达式 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 == > < > = <= 要求打印第三行 案例1: awk -F: 'NR == 3{print $0} /etc/passwd' 解析: NR : 行号 NR == 3 : 行号等于3 注意: $ 1 : 是列 NR == 3 : 是行
逻辑表达式 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 && : 逻辑与 || : 逻辑或 ! : 逻辑非 案例1:(与(两者条件必须都成立)) awk -F: '$3 + $4 > 2000 && $3 * $4 > 2000{print $0}' /etc/passwd 案例2:(或(两者条件一个成立即可)) awk -F: '$3 + $4 > 2000 || $3 * $4 > 2000{print $0}' /etc/passwd 案例3:(非(条件取反)) awk -F: '!($3 + $4 > 2000){print $0}' /etc/passwd
grep 查找功能 过滤文本