一、tr(替换命令) 二、grep(文本匹配) 三、sed(文本替换) 四、awk(强大的文本分析工具) 1、基本用法 2、条件表达式 过滤 3、内建变量 4、脚本 5、正则匹配 一、tr(替换命令) 1 echo 12345 | tr '0-9' '9876543210' //加解密转换,替换对应字符 2 cat file | tr -d '0-9' // 删除所有数字 3 cat file | tr -d -c '0-9' //删除非数字数据 4 cat file | tr -s ' ' // 压缩多余的空格 二、grep(文本匹配) -v :返回不匹配的 -e:后跟匹配模式,可以跟多个-e参数,来进行多个模式的匹配 三、sed(文本替换) -e:后面跟处理命令,有时候也可不写-e,没有-e时后面需要单引号包裹 sed默认输出替换后的内容 -i 参数直接替换源文件
sed 's/text/replace_text/' file #替换每一行的第一处匹配的text sed 's/text/replace_text/g' file #替换全部 nl filename | sed '2,5d' # 删除2——5行 sed -e 4a\newLine testfile # 在第4行后面加新行“newLine” nl filename | sed '2a drink tea' # 第2行后加新行“drink tea” sed -e '4 a newline\nnewline2' testfile # 加两行 nl filename | sed -n '/text/p' #匹配text,“-n” 参数可以使得只输出匹配到的行 nl filename | sed '/text/d' # 匹配并删除 # 匹配字符串“root” 并在匹配的行中将text替换为replace、打印、退出 # 匹配之后执行的命令放到**大括号**里,命令之间**分号分割** nl filename | sed -n '/root/{s/text/replace/;p;q}' nl filename | sed 's/^.*begin//g' # 关键是正则部分,将begin前的删除 sed 's/^.\{3\}/&\//g' file # 字符串插入字符:将文本中每行内容(ABCDEF) 转换为 ABC/DEF: nl filename | sed -e '3,$d' -e 's/bash/blueshell/' # 多点编辑 四、awk(强大的文本分析工具) 命令格式 1 awk -F -va=1 -vb=s '分隔符' 'script' filename 2 awk -f scriptfile fileneame 3 awk BEGIN{ } { } END{ } -v:后面跟定义的变量如上面定义了 a =1 ,b=s $awk -va=1 '{print $1,$1+a}' log.txt 2 3 3 4 $awk -va=1 -vb=s '{print $1,$1+a,$1b}' log.txt 2 3 2s 3 4 3s -F:分割符,可以跟多个如 -F '[.,]’ 点和逗号为分隔符,默认空格和tab awk -F '[ ,]' '{print $1,$2,$5}' log.txt -f 后面跟脚本文件脚本文件格式如下 #!/bin/awk -f BEGIN{} # 运行前 {} # 以每一行为单位执行这里面的脚本 END{} # 运行后 1、基本用法 awk '{print $1,$4}' log.txt # awk '{printf "%-8s %-10s\n",$1,$4}' log.txt # 格式化输出 2、条件表达式 过滤 几乎支持所有的 c 比较符,可以使用 &&、|| 连接 awk '$1>2 && $2=="Are" {print $1,$2,$3}' log.txt 3 Are you ok 3、内建变量 $n:表示第列, $0:表示所有列 FS:域分隔符, 默认为空白字符 RS:记录分割符,默认为换行 NR:已经读出的记录数,从1开始 4、脚本 脚本中支持判断(if-else if - else),循环(while,for等)与C类似 例子:脚本为cal.awk,原始文件为score.txt $cat score.txt Marry 2143 78 84 77 Jack 2321 66 78 45 Tom 2122 48 77 71 Mike 2537 87 97 95 Bob 2415 40 57 62 $ cat cal.awk #!/bin/awk -f #运行前 BEGIN { math = 0 english = 0 computer = 0 printf "NAME NO. MATH ENGLISH COMPUTER TOTAL\n" printf "---------------------------------------------\n" } #运行中 { math+=$3 english+=$4 computer+=$5 printf "%-6s %-6s %4d %8d %8d %8d\n", $1, $2, $3,$4,$5, $3+$4+$5 } #运行后 END { printf "---------------------------------------------\n" printf " TOTAL:%10d %8d %8d \n", math, english, computer printf "AVERAGE:%10.2f %8.2f %8.2f\n", math/NR, english/NR, computer/NR } # 执行结果 $ awk -f cal.awk score.txt NAME NO. MATH ENGLISH COMPUTER TOTAL --------------------------------------------- Marry 2143 78 84 77 239 Jack 2321 66 78 45 189 Tom 2122 48 77 71 196 Mike 2537 87 97 95 279 Bob 2415 40 57 62 159 --------------------------------------------- TOTAL: 319 393 350 AVERAGE: 63.80 78.60 70.00 5、正则匹配~ 表示模式开始,当整行匹配是不需要 ~ # 输出第二列包含 "th",并打印第二列与第四列 awk '$2 ~ /th/ {print $2,$4}' log.txt awk '$2 !~ /th/ {print $2,$4}' log.txt # 取反 # 整行匹配的时候可以这样写 去掉 “ ~ ” awk '/re/' log.txt awk '!/th/ {print $2,$4}' log.txt # 匹配 re 或 th awk '/re|th/' log.txt ———————————————— 版权声明:本文为CSDN博主「FSky-晓」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/weixin_43659784/article/details/115774004 ———————————————— 版权声明:本文为CSDN博主「FSky-晓」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/weixin_43659784/article/details/115774004 ———————————————— 版权声明:本文为CSDN博主「FSky-晓」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/weixin_43659784/article/details/115774004 |
|
来自: ZhouAndrew > 《AI&NewIT》