Linux 文本处理命令 tr/grep/sed/awk

一、tr(替换命令)

echo 12345 | tr '0-9' '9876543210' //加解密转换,替换对应字符
cat file | tr -d '0-9' // 删除所有数字
cat file | tr -d -c '0-9'  //删除非数字数据
cat file | tr -s ' ' // 压缩多余的空格

二、grep(文本匹配)

  • -v :返回不匹配的
  • -e:后跟匹配模式,可以跟多个-e参数,来进行多个模式的匹配

三、sed(文本替换)

  • -e:后面跟处理命令,有时候也可不写-e,没有-e时后面需要单引号包裹
  • sed默认输出替换后的内容 -i 参数直接替换源文件

  • a :新增:
  • d :删除
  • c :取代
  • s :取代
  • i :插入
  • p:打印

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(强大的文本分析工具)

  • 命令格式
awk -F -va=1 -vb=s '分隔符' 'script' filename
awk -f  scriptfile fileneame
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
    
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值