1、 什么时候适合使用awk命令
(1) 逐行处理文件,希望对文件中每行文件的数据进行剔除,修改,会增加
(2) 除了基本的文件处理外,有更加复杂需求,如会进行全局计算,全局变量填写,都可以使用awk来帮助你分析
2、awk 的运作模式
2.1 awk是如何工作的
(1) 逐行读取输入的文本内容,一次从输入中读取一行数据,并且默认对每行的数据使用换行符进行分隔,每行分隔后的数据可通过$符号进行获取。
awk '{print $1}' /tmp/file.log
tail -10 /tmp/file.log | awk '{print $1}'
(2) 按照中括号{}命令内容,修改流中的数据。
awk '{$1="";$2="123";print $3}' /tmp/file.log
# 如果{}要处理的逻辑比较复杂,通过-f执行指定脚本处理
awk -fexecute.awk /tmp/file.log
(3) 将新的数据进行输出,你可以使用 >1.log输出到一个新的1.log文件,总之awk不会都原数据进行修改。
3、awk的几个常用参数
-f 参数
如果你是指定文件进行awk处理,那么你可以通过-f参数指定文件路径进行处理
awk -f '/tmp/file.log' '{print $1}'
$符号的使用
awk 命令的强大之处,他为你要处理的内容中,每行的每个元素都分配了变量名称,可以通过$符号来控制,awk默认使用空格作为每行数据的分隔符号。
如果file.log数据内容如下所示
a b c d e f g
h i j
那么使用awk命令执行
cat file.log | awk '{print $1}'
输出内容为
a
h
-F参数 指定每行数据的分隔符
file.log内容如下
a#b#d#e#f#g
h#i#j
执行一下脚本后
cat /tmp/file.log | awk -F '#' '{print $2}'
输出
b
i
awk BEGIN&END关键字
紧跟着BEGIN关键字后面的执行脚本,会在awk执行前,只执行一次,反之END就是在awk全部处理完成后,再执行一次接跟着END后面的脚本。注意,在整个awk'处理过程中,BEGIN与END后面的脚本只会执行一次。
$ cat file.log
a#b#d#e#f#g
h#i#j
注意,BEGIN 和end后面的脚本,和实际逻辑处理的脚本都会作为一个处理的整体,所以需要整体用单引号括起来
$ cat /tmp/file.log | awk -F '#' 'BEGIN {print "处理执行开始"} {print $1} END {print "处理结果"}'
处理执行开始
a
h
处理结果
4、使用实战
剔除指定位置字符,将指定位置字符置为空。
$ cat 1.log
a废话1 a有用信息2 a有用信息3 a有用信息4 a废话5
b废话1 b有用信息2 b有用信息3 b有用信息4 b废话5
如果仅想剔除其中有用信息,那么执行以下脚本即可,下面的脚本可以帮助我们,将按空格分隔后第1个和第5个字符置为空。
$ cat 1.log | awk '{$1=""; $5=""; print $0}'
a有用信息2 a有用信息3 a有用信息4
b有用信息2 b有用信息3 b有用信息4
2 awk多分隔符进行字符串分隔(awk 多个分隔符)
若文件中的内容如下,可以看出,文件中的内容的每行数据并不是标准的空格分隔的数据,如果我想获取到 ‘调用我的客户端ip’这个字段,那么可以把'('和','也就是左括号和逗号都视为分隔符,然后进行取数。
awk命令的-F参数是支持多个分隔符的,通过在[]设置多个字符,进行分隔,具体使用如下
2.1 awk多分隔符,多个不同的字符串进行分隔
$ cat 2.log
2020-02-08 14:27:00 [业务单据号((接口名称,是否执行成功,执行耗时)(调用我的客户端ip,我的当前ip))]
2020-02-08 14:27:00 [业务单据号((接口名称,是否执行成功,执行耗时)(调用我的客户端ip,我的当前ip))]
2020-02-08 14:27:00 [业务单据号((接口名称,是否执行成功,执行耗时)(调用我的客户端ip,我的当前ip))]
如果以[作为分隔符,脚本如下
$ cat 2.log | awk -F'[' '{print $2;}'
业务单据号((接口名称,是否执行成功,执行耗时)(调用我的客户端ip,我的当前ip))]
业务单据号((接口名称,是否执行成功,执行耗时)(调用我的客户端ip,我的当前ip))]
业务单据号((接口名称,是否执行成功,执行耗时)(调用我的客户端ip,我的当前ip))]
如果以[或者(作为分隔符,脚本如下,此时需要将[(在最外层包裹一个[],-F命令中[]中的内容表示的是或的关系,[][]中括号和括号之间,表示的是与的关系。
$ cat 2.log | awk -F '[[(]' '{print $2}'
业务单据号
业务单据号
业务单据号
如果以)(组合作为一个分隔符,脚本如下
$ cat 2.log | awk -F '[)][(]' '{print $2}'
调用我的客户端ip,我的当前ip))]
调用我的客户端ip,我的当前ip))]
调用我的客户端ip,我的当前ip))]
网友评论