Linux shell 之 awk的用法
2015-12-19 18:42
585 查看
aw k语言的最基本功能是在文件或字符串中基于指定规则浏览和抽取信息
调用awk
有三种方式调用a w k,
第一种是命令行方式,如:
awk –F : ‘commands’ input-files
第二种方法是将所有a w k命令插入一个文件,并使a w k程序可执行,然后用a w k命令作为脚本的首行,以便通过键入脚本名称来调用它。
第三种方式是将所有的a w k命令插入一个单独文件,然后调用:
awk –fawk-script-file input-files
awk脚本
模式和动作
在命令中调用a w k时,a w k脚本由各种操作和模式组成。模式包括两个特殊字段B E G I N和E
N D。
使用B E G I N语句设置计数和打印头。B E G I N语句使用在任何文本浏览动作之前。E N
D语句用来在a w k完成文本浏览动作后打印输出文本总数和结尾状态标志。
实际动作在大括号{ }内指明。
域和记录
$ 0,意即所有域
• 确保整个a w k命令用单引号括起来。
• 确保命令内所有引号成对出现。
• 确保用花括号括起动作语句,用圆括号括起条件语句。
awk中的正则表达式
+ 使用+匹配一个或多个字符。
? 匹配模式出现频率。例如使用/X Y?Z/匹配X Y Z或Y
Z。
awk'{if($4~/Brown/) print $0}' tab2
等效于
awk'$0 ~ /Brown/' tab2
内置变量
awk'{print NF,NR,$0}END{print FILENAME}' tab1
NF 域的总数
NR已经读取的记录数
FILENAME
awk'{if(NR>0 && $2~/JLNQ/) print $0}END{print FILENAME}' tab1
显示文件名
echo"/app/oracle/ora_dmp/lisx/tab1" | awk -F/ '{print $NF}'
定义域名
awk'{owner=$2;number=$3;if(owner~/SYSADMIN/ && number!=12101)print$0}END{print FILENAME}' tab1
awk'BEGIN{NUM1=7}{if($1<=NUM1) print $0}END{print FILENAME}' tab1
当在a w k中修改任何域时,重要的一点是要记住实际输入文件是不可修改的,修改的只是保存在缓存里的aw k复本
awk'BEGIN{NUM1=7}{if($1<=NUM1) print $1+2,$2,$3+100}END{print FILENAME}' tab1
只打印修改部分:用{}
awk'BEGIN{NUM1=7}{if($1<=NUM1){$2="ORACLE";print $0}}END{print"filename:"FILENAME}' tab1
可以创建新的域
awk'BEGIN{NUM1=7;print"COL1"tCOL2"tCOL3"tCOL4"}{if($1<=NUM1){$4=$1*$3;$2="ORACLE";print $0}}END{print "filename:"FILENAME}' tab1
打印总数:
awk'BEGIN{NUM1=7;print"COL1"tCOL2"tCOL3"tCOL4"}{if($1<=NUM1){tot+=$3;$4=$1*$3;$2="ORACLE";print $0}}END{print "filename:"FILENAME "total col3:" tot}'tab1
使用此模式打印文件名及其长度,然后将各长度相加放入变量t o t中。
ls-l | awk '/^[^d]/ {print$9""t"$5} {tot+=$5}END{print "totalKB:" tot}'
内置字符串函数
gsub 字符要用引号,数字不用
awk'gsub(/12101/,"hello") {print $0} END{print FILENAME}' tab1
awk 'gsub(/12101/,3333) {print $0}END{print FILENAME}' tab1
index
awk '{printindex($2,"D")""t";print $0}' tab1
awk '{printindex($2,"D")""t" $0}' tab1
length
awk '{printlength($2)""t" $0}' tab1
ma
awk '{printmatch($2,"M")""t" $0}' tab1
split
awk '{printsplit($2,new_array,"_")""t" $0}' tab1
sub 替换成功返回1,失败返回0
awk '{printsub(/SYS/,"oracle",$2)""t" $0}' tab1
substr
awk '{printsubstr($2,1,3)""t" $0}' tab1
从s h e l l中向a w k传入字符串
echo "Stand-by" | awk'{print length($0)""t"$0}'
8 Stand-by
file1="tab1"
cat $file1 | awk '{printsub(/ADMIN/,"sss",$2)""t"$0}'
字符串屏蔽序列
"b 退格键 " t t a b键
"f 走纸换页 " d d d 八进制值
"n 新行 " c 任意其他特殊字符,例如""为反斜线符号
"r 回车键
awk printf修饰符
- 左对齐
Wid t h 域的步长,用0表示0步长
. pr e c 最大字符串长度,或小数点右边的位数
如果用格式修饰输出,要指明具体的域,程序不会自动去分辨
awk'{printf "%-2d %-10s %d"n", $1,$2,$3}' tab1
输出结果
9 SYSADMIN 12101
9 SYSADMIN 12101
14SYSADMIN 121010000012002
9 SYSADMIN 12101
2 JLNQ 12101
2 JLNQ 12101
7 SYSADMIN 12101
7 SYSADMIN 12101
6 ac_ds_e_rr_mr13333
向一行a w k命令传值
awk'BEGIN{SYS="SYSADMIN"}{if($2==SYS) printf "%-2d %-10s%d"n", $1,$2,$3}' tab1
在动作后面传入
awk '{if($2==SYS) printf"%-2d %-10s %d"n", $1,$2,$3}' SYS="SYSADMIN" tab1
awk脚本文件
调用awk
有三种方式调用a w k,
第一种是命令行方式,如:
awk –F : ‘commands’ input-files
第二种方法是将所有a w k命令插入一个文件,并使a w k程序可执行,然后用a w k命令作为脚本的首行,以便通过键入脚本名称来调用它。
第三种方式是将所有的a w k命令插入一个单独文件,然后调用:
awk –fawk-script-file input-files
awk脚本
模式和动作
在命令中调用a w k时,a w k脚本由各种操作和模式组成。模式包括两个特殊字段B E G I N和E
N D。
使用B E G I N语句设置计数和打印头。B E G I N语句使用在任何文本浏览动作之前。E N
D语句用来在a w k完成文本浏览动作后打印输出文本总数和结尾状态标志。
实际动作在大括号{ }内指明。
域和记录
$ 0,意即所有域
• 确保整个a w k命令用单引号括起来。
• 确保命令内所有引号成对出现。
• 确保用花括号括起动作语句,用圆括号括起条件语句。
awk中的正则表达式
+ 使用+匹配一个或多个字符。
? 匹配模式出现频率。例如使用/X Y?Z/匹配X Y Z或Y
Z。
awk'{if($4~/Brown/) print $0}' tab2
等效于
awk'$0 ~ /Brown/' tab2
内置变量
awk'{print NF,NR,$0}END{print FILENAME}' tab1
NF 域的总数
NR已经读取的记录数
FILENAME
awk'{if(NR>0 && $2~/JLNQ/) print $0}END{print FILENAME}' tab1
显示文件名
echo"/app/oracle/ora_dmp/lisx/tab1" | awk -F/ '{print $NF}'
定义域名
awk'{owner=$2;number=$3;if(owner~/SYSADMIN/ && number!=12101)print$0}END{print FILENAME}' tab1
awk'BEGIN{NUM1=7}{if($1<=NUM1) print $0}END{print FILENAME}' tab1
当在a w k中修改任何域时,重要的一点是要记住实际输入文件是不可修改的,修改的只是保存在缓存里的aw k复本
awk'BEGIN{NUM1=7}{if($1<=NUM1) print $1+2,$2,$3+100}END{print FILENAME}' tab1
只打印修改部分:用{}
awk'BEGIN{NUM1=7}{if($1<=NUM1){$2="ORACLE";print $0}}END{print"filename:"FILENAME}' tab1
可以创建新的域
awk'BEGIN{NUM1=7;print"COL1"tCOL2"tCOL3"tCOL4"}{if($1<=NUM1){$4=$1*$3;$2="ORACLE";print $0}}END{print "filename:"FILENAME}' tab1
打印总数:
awk'BEGIN{NUM1=7;print"COL1"tCOL2"tCOL3"tCOL4"}{if($1<=NUM1){tot+=$3;$4=$1*$3;$2="ORACLE";print $0}}END{print "filename:"FILENAME "total col3:" tot}'tab1
使用此模式打印文件名及其长度,然后将各长度相加放入变量t o t中。
ls-l | awk '/^[^d]/ {print$9""t"$5} {tot+=$5}END{print "totalKB:" tot}'
内置字符串函数
gsub 字符要用引号,数字不用
awk'gsub(/12101/,"hello") {print $0} END{print FILENAME}' tab1
awk 'gsub(/12101/,3333) {print $0}END{print FILENAME}' tab1
index
awk '{printindex($2,"D")""t";print $0}' tab1
awk '{printindex($2,"D")""t" $0}' tab1
length
awk '{printlength($2)""t" $0}' tab1
ma
awk '{printmatch($2,"M")""t" $0}' tab1
split
awk '{printsplit($2,new_array,"_")""t" $0}' tab1
sub 替换成功返回1,失败返回0
awk '{printsub(/SYS/,"oracle",$2)""t" $0}' tab1
substr
awk '{printsubstr($2,1,3)""t" $0}' tab1
从s h e l l中向a w k传入字符串
echo "Stand-by" | awk'{print length($0)""t"$0}'
8 Stand-by
file1="tab1"
cat $file1 | awk '{printsub(/ADMIN/,"sss",$2)""t"$0}'
字符串屏蔽序列
"b 退格键 " t t a b键
"f 走纸换页 " d d d 八进制值
"n 新行 " c 任意其他特殊字符,例如""为反斜线符号
"r 回车键
awk printf修饰符
- 左对齐
Wid t h 域的步长,用0表示0步长
. pr e c 最大字符串长度,或小数点右边的位数
如果用格式修饰输出,要指明具体的域,程序不会自动去分辨
awk'{printf "%-2d %-10s %d"n", $1,$2,$3}' tab1
输出结果
9 SYSADMIN 12101
9 SYSADMIN 12101
14SYSADMIN 121010000012002
9 SYSADMIN 12101
2 JLNQ 12101
2 JLNQ 12101
7 SYSADMIN 12101
7 SYSADMIN 12101
6 ac_ds_e_rr_mr13333
向一行a w k命令传值
awk'BEGIN{SYS="SYSADMIN"}{if($2==SYS) printf "%-2d %-10s%d"n", $1,$2,$3}' tab1
在动作后面传入
awk '{if($2==SYS) printf"%-2d %-10s %d"n", $1,$2,$3}' SYS="SYSADMIN" tab1
awk脚本文件
相关文章推荐
- Powershell-Exchange:设置分层通讯薄中通讯组的优先级
- Powershell-Exchange:如何确定用户是否设置了邮件流转发
- shell统计平均值和BX求值的问题
- adb shell 打开应用程序
- Bash关闭输出(关闭正确、错误输出)
- shell 中的连接符(并且&&、与;、或||)
- Bash算术计算
- Bash函数使用
- Bash从路径中获取文件名
- Bash中的$符号
- 过生日,也要学学哈,这次是SHELL的GETOPTS
- shell 变量
- Bash判断是否是root
- shell字符串处理
- Bash循环分类介绍
- Bash判断文件夹(目录)是否存在
- Bash判断文件是否存在
- Bash中的数组
- shell 入门
- 《linux命令行与shell脚本编程大全》学习笔记(2)