文本处理三剑客系列笔记:
文本处理三剑客 – grep:https://blog.csdn.net/d1240673769/article/details/121407615
文本处理三剑客 – sed:https://blog.csdn.net/d1240673769/article/details/103723838
awk是linux中处理文本的强大工具,或者说是一种专门处理字符串的语言,它有自己的编码格式。awk的强大之处还在于能生成强大的格式化报告。
awk [options] 'program' file
有多种版本:New awk(nawk),GNU awk(gawk)
gawk:模式扫描和处理语言
基本用法:
awk [options] 'program' var=value file...
awk [options] -f programfile.awk var=value file...
awk [options] 'BEGIN{ACTION;...} pattern{action;...} END{action;...}' file...
awk 程序通常由:BEGIN语句块、能够使用模式配的通用语句块、EMD语句块,共三部分组成
program通常在被单引号或双引号中
选项:-F 指明输入时用到的字段分隔符,-v var=value:自定义变量
要点:
awk -F: '{print}' /etc/passwd
awk -F: '{print $0}' /etc/passwd
awk -F: '{print $1}' /etc/passwd
awk -F: '{print $1"\t"$3}' /etc/passwd
awk -F: '{print "hhhhhhhh"}' /etc/passwd
tail -3 /etc/fstab |awk '{print $2,$4}'
awk 'BEGIN{print "读取/etc/passwd文件..."} {print} END{print "读取结束..."}' /etc/passwd
有内置和自定义变量
awk -v FS=':' '{print $1,FS,$3}' /etc/passwd
awk -F: '{print $1,$2,$3}' /etc/passwd
awk -v FS=':' -v OFS=':' '{print$1,$3,$7}' /etc/passwd
awk -v RS='' '{print}' /etc/passwd
awk -v RS='' -v ORS='###' '{print}' /etc/passwd
awk -F: '{print NF}' /etc/passwd #引用内置变量不用$
awk -F: 'print $(NF-1)' /etc/passwd
awk '{print NR}' /etc/fstab
awk '{print} END{print NR}' /etc/fstab
awk '{print FNR}' /etc/fstab /etc/inittab
awk '{print FILENAME}' /etc/fstab
awk '{print ARGC}' /etc/fstab /etc/inittab
awk 'BEGIN{print ARGC}' /etc/fstab /etc/inittab
awk 'BEGIN{print ARGV[0]}' /etc/fstab /etc/inittab
awk 'BEGIN{print ARGV[1]}' /etc/fstab /etc/inittab
自定义变量(区分字符大小写)
(1)-v var=value
(2)在program中直接定义(变量在program中定义时,需要使用引号引起来)
示例:
awk -v test='hello gawk' '{print test}' /etc/fstab
awk -v test='hello gawk' 'BEGIN{print test}'
awk 'BEGIN{test="hello, gawk"; print test}'
awk -F: '{sex="male"; print $1,sex,age;age=18}' /etc/passwd
格式化输出:printf FORMAT,item1,item2…
要点:
awk '{printf "%s\n",$1}' /etc/fstab
awk -F: '{printf "username: %s,UID:%d\n",$1,$3}' /etc/passwd
awk -F: '{printf "username: %15s,UID:%d\n",$1,$3}' /etc/passwd
awk -F: '{printf "username: %-15s,UID:%d\n",$1,$3}' /etc/passwd
awk -F: '{printf "username: %-20s shell: %s\n",$1,$NF}' /etc/passwd
比较操作符:
== , != , > , >= , < , <=
模式匹配符:
~:左边是否和右边匹配(包含)
!~:是否不匹配
示例:
awk -F: '$0 ~ /root/' /etc/passwd
awk -F: '$0 ~ /root/{print $1}' /etc/passwd
awk '$0 ~ "^root"' /etc/passwd
awk -F: '$0 !~ /root/' /etc/passwd
awk -F: '$3==0' /etc/passwd
逻辑运算符:与&&,或||,非!
示例:
awk -F: '$3>=0 && $3>=1000' /etc/passwd
awk -F: '$3>=0 || $3>=1000' /etc/passwd
awk -F: '!($3==0) {print $1"\t"$3}' /etc/passwd
awk -F: '!($3>=500) {print $3}' /etc/passwd
条件表达式(三目表达式):
awk -F: '{$3>=1000?usertype="Common User":usertype="Sysadmin or SysUser"; printf "%15s:%-s\n",$1,usertype}' /etc/passwd
pattern: 根据pattern条件,过滤匹配的行,再做处理
(1)如果未指定:空模式,匹配一行
(2)/regular expression/:仅处理能够模式匹配到的行,需要用/ / 括起来
awk '/^UUID/ {print $1}' /etc/fstab
awk '!/^UUID/ {print $1}' /etc/fstab
(3)relational expression:关系表达式,结果为真才会被处理
awk -F: 'i=1;j=1 {print i,j}' /etc/passwd
awk '!0' /etc/passwd
awk '!1' /etc/passwd
awk -F: '$3>=1000 {print $1,$3}' /etc/passwd
awk -F: '$NF~/bash$/ {print $1,$NF}' /etc/passwd
(4)line ranges:行范围
awk -F: '/^root/,/^nobody/ {print $1}' /etc/passwd
awk -F: '(NR>=10&&NR<=20){print NR,$1}' /etc/passwd # 10-20行
(5)BEGIN/END 模式