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