ShellAwk

关于awk(简单用法)

2018-12-21  本文已影响59人  Prince_wyf

关于awk

使用方法awk'{pattern + action}'{filenames}

pattern 表示 AWK 在数据中查找的内容,而 action 是在找到匹配内容时所执行的一系列命令。花括号({})不需要在程序中始终出现,但它们用于根据特定的模式对一系列指令进行分组。 pattern就是要表示的正则表达式,用斜杠括起来。awk语言的最基本功能是在文件或者字符串中基于指定规则浏览和抽取信息,awk抽取信息后,才能进行其他文本操作。完整的awk脚本通常用来格式化文本文件中的信息。通常,awk是以文件的一行为处理单位的。awk每接收文件的一行,然后执行相应的命令,来处理文本。

调用awk有三种方式调用awk1.命令行方式awk[-Ffield-separator]'commands'input-file(s)其中,commands是真正awk命令,[-F域分隔符]是可选的。input-file(s)是待处理的文件。在awk中,文件的每一行中,由域分隔符分开的每一项称为一个域。通常,在不指名-F域分隔符的情况下,默认的域分隔符是空格。

awk工作流程是这样的:读入有’n’换行符分割的一条记录,然后将记录按指定的域分隔符划分域,填充域,0则表示所有域,1表示第一个域,$n表示第n个域。默认域分隔符是”空白键” 或 “键”

1.基本命令格式 awk [-F 以...分割] '操作'
eg:

test5 
name wangyifan age 18
name zhangsan age 16 
name lisi age 19
name wangwu age 20
1. cat test5.txt | awk '{print $1","$4}'   没加 -F 默认以空格进行分割
结果: 
name,18
name,16
name,19
name,20
name:wangyifan age:18
name:zhangsan age:16 
name:lisi age:19
name:wangwu age:20 
cat test5.txt | awk -F ':' '{print $2 $4}'
结果:
wangyifan18
zhangsan16 
lisi19
wangwu20

  1. BEGIN END 的用法
cat test5.txt | awk -F ':' 'BEGIN{print "姓名" "年龄"} {print $1 "---" $4} END{print "hahaha" "end end end"}'

执行流程:
awk工作流程是这样的:先执行BEGING,然后读取文件,读入有/n换行符分割的一条记录,然后将记录按指定的域分隔符划分域,填充域,0则表示所有域,1表示第一个域,$n表示第n个域,随后开始执行模式所对应的动作action。接着开始读入第二条记录······直到所有的记录都读完,最后执行END操作。

  1. awk 搜索
    这种是pattern的使用示例,匹配了pattern(这里是wangyifan)的行才会执行action(没有指定action,默认输出每行的内容)。
awk -F ':' '/wangyifan/{print $2}' test5.txt
结果:  
wangyifan
awk -F ':' '/1[0-9]?/{print $2}' test5.txt    # 支持正则
# 结果
wangyifan
zhangsan
lisi
  1. awk 内置变量

ARGC命令行参数个数
ARGV命令行参数排列
ENVIRON支持队列中系统环境变量的使用
FILENAMEawk浏览的文件名
FNR浏览文件的记录数
FS设置输入域分隔符,等价于命令行-F选项
NF浏览记录的域的个数
NR已读的记录数
OFS输出域分隔符
ORS输出记录分隔符
RS控制记录分隔符

eg:
awk -F ":" '{print "文件名",FILENAME "行数",NR "域数",NF}'  test5.txt 
结果:
文件名 test5.txt行数 1列数 4
文件名 test5.txt行数 2列数 4
文件名 test5.txt行数 3列数 4
文件名 test5.txt行数 4列数 4

6.自定义变量 (坑)

cat test5.txt | awk -F ':' 'BEGIN{aaa="qwe123";print aaa}{print $1,$7} END{print "bbb"}'
#  注意 BEGIN 里面调用变量的时候不加 $
  1. printf (python 格式化字符串) printf()
awk -F ':' '{printf("filename %s,rownum %s,linenum %s, content %s",FILENAME,NR,NF,$0)}' test5.html
  1. awk 操作符

(1)算数操作符
-x
+x
x^y
x*y
x
y
x/y
x+y
x-y
x%y
(2)赋值操作符
=
+=
-=
*=
/=
%=
++
--
(3)布尔值
awk中,任何非0值或者非空字符串都为真,反之为假
(4)比较操作符:>,<,>=,<=,==,!=,,!(x ~ y,字符串能被表达式y匹配)
(5)逻辑操作符:&&,||,!

awk -F ':' '$1=="root"{printf("%s 是管理员账户",$1)}'   # 匹配到就打印匹配不到没有输出结果
结果:
root 是管理员账户
  1. 总结几种常见的操作模式
    正则
awk -F '/reg/{xxx操作}' filename    #  按照正则匹配操作 如果匹配到就执行,如果匹配不到不执行

表达式

例:
awk -F ':' '$1=="root"{printf("%s 是管理员账户",$1)}' /etc/passwd
结果:   root 是管理员账户
匹配范围         
awk -F ':' '$1=="root",$1=="admin1"{printf("username %s shell %s" "\n"),$1,$7}' /etc/passwd
结果:
username root shell /bin/bash
username bin shell /sbin/nologin
username apache shell /sbin/nologin
username saslauth shell /sbin/nologin
username postfix shell /sbin/nologin
username mysql shell /bin/bash
username pulse shell /sbin/nologin
username sshd shell /sbin/nologin
username tcpdump shell /sbin/nologin
username admin1 shell /bin/bash
#    代表从root 到 admin1账户 

最后

grep 更适合单纯的查找或匹配文本
sed 更适合编辑匹配到的文本
awk 更适合格式化文本,对文本进行较复杂格式处理

上一篇 下一篇

猜你喜欢

热点阅读