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