Awk Sed 学习

1.Awk - 行处理命令

简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。

awk 'pattern  {action}'  pattern 表示每行匹配的正则,action 表示要对每行数据的操作,可以有多个操作。

awk 自带的变量 可以在action里面用到,如下:

ARGC   命令行变元个数 
ARGV   命令行变元数组 
FILENAME   当前输入文件名 
FNR   当前文件中的记录号 
FS   输入域分隔符,默认为一个空格 
RS   输入记录分隔符 
NF   当前记录里域个数 
NR   到目前为止记录数 
OFS   输出域分隔符 
ORS   输出记录分隔符 

举例如下:

#文件test.txt
cat test.txt
20190101 20190102 20190304
11|23 23|24
#两个斜杠里面表示正则匹配
#包含101的行
 awk '/101/' test.txt
#包含101或者23的行
 awk '/101/,/23/ ' test.txt 
#$1表示每行的第一个字符串 默认空格是分割符
#每行第一个字符串是"20190203"的行 == && > < <= >=等都可以使用
 awk '$1=="20190203"' test.txt
#NR 表示行号,NF表示每行列的数量
#打印每行行号,列的个数和最后一列。
 awk '{print NR,NF,$NF}' test.txt
#通过管道获取输入
 cat test.txt | awk '{print NR,NF,$NF}'
#打印每行最后一列,指定列分隔符
 awk -F "|" '{print $NF}'  test.txt
#指定列分割符变量 FS
 awk 'BEGIN{FS="|"} {print $NF}' test.txt 
#正则指定列分割符 :\t | 三种都作为列分割符
 awk -F '[:\t|]' '{print $NF}' test.txt 
#OFS指定输出分割符
 awk 'BEGIN{OFS="%"} {print $1,$2}' test.txt 
#BEGIN  表示在读取文本之前做的操作;三目表达式使用
 awk 'BEGIN{max=100;print"max="max}'
 awk 'BEGIN{max=100;print"max="max} {max=(max>$1?max:$1); print $1, max} ' test.txt
#变量if else 使用 
 #找到匹配行后替换
 awk '$1=='20190101' {$1='222';print $1}' test.txt
 #匹配多次 多次处理,第一次查找开头是20190101的行定义变量 第二次查找开头是|的数据输出。
 awk  '/^20190101/ {page=NR;str=substr($1,0,9);}  /^\|/{print str,$0}'

单独awk脚本 例子:vi awk.sh

 #!/usr/bin/awk -f   
/^20190101/ {page=NR;str=substr($1,0,9);}  
/^\|/ {print str,$0} 

执行方式:./awk.sh  text.txt 

2.Sed - 命令是利用脚本来处理文本文件 ,-i 可直接改变原文件,测试时小心。

sed [-hnV] [-e<script>] [-f<script文件>] [文本文件] 
#查看sed版本
 sed --version 
#查看帮助
 sed -h
#指定处理规则 -e 和 -f的区别 是否需要把动作写到文本里面
 sed -e 动作      文件 
 sed -f 动作脚本  文件
动作说明:
 a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
 c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
 d :删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
 i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
 p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~
 s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正则表达式
测试如下:

#新增test.txt 第三行新增一行
sed -e 3a"this is dog"  test.txt
sed  '3a this is dog'  test.txt
#列出行号 删除1-2行
nl test.txt |sed '1,2d'
#删除第二行
nl test.txt |sed '2d'
#删除第二到最后
nl test.txt |sed '2,$d'
#第一行 和第二行替换为hello,\n表示换行
sed  '1,2c hello\nhello' test.txt
#第一行 第二行替换为hello
sed  '1,2c hello' test.txt
#-n显示出来后的结果 p表示打印
cat test.txt |sed -n  '1,2p'
#多点编辑 s 替换 支持正则匹配替换
cat test.txt |sed -e '1,2d' -e 's/|2019/2019/'


#-i 可直接修改源文件 小心使用 2019替换为!
sed -i 's/2019/!/' test.txt 

sed 脚本使用

vi sed.sh

1,2d 
s/!/2019/


使用 sed -f sed.sh ./test.txt

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值