分享

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

 ZhouAndrew 2023-10-14 发布于江苏

一、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 参数直接替换源文件

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

命令格式

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

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多