标签:asc grep ons etc 自动 命令行 选项 $0 令行
1、linux文本处理工具: 文本过滤工具:grep、egrep、fgrep
行编辑工具:sed
格式化文本工具:awk、gawk
注意:centos7中,awk是指向gwak的链接文件。
[root@localhost ~]# ll -l `which awk`
lrwxrwxrwx. 1 root root 4 Aug 29 20:01 /usr/bin/awk -> gawk
[root@localhost ~]#
2、awk工作原理:
awk从文本中一次读取一行,按指定的分隔符切割成若干个片段部分,默认的分隔符是“空白”字符,每个分片都保存在awk内建的变量中($1,$2,$3...),然后用动作(常用的print、printf命令)去输出这些行中的某一个分片、某几个或者整行分片。整行内容用"$0"表示,切割出来的每一分片,也可以进行加工处理。
3、awk命令:
格式:gawk [OPTIONS] 'program' FILE ... //注意program要用单引号引起来
3.1、awk的OPTIONS: -F:指定输入时的字段分割符,用于文件中读取时以什么为分割符;默认为空格分割符 -v var=value :自定义变量 |
3.2、awk的program的格式:
PATTERN{ACTION STATEMENT} //此处的PATTERN作用主要是界定需要编辑的行,action执行的动作,statement要执行的语句,可以有多个,语句之间以分号(;)分隔。
示例:
[root@localhost ~]# tail -3 /etc/fstab | awk '{print $2,$4}' //输出时默认以空白字符分隔片段;cut只能理解单个或固定的空白字符。
常用的action:
①、expression:运算表达式
②、control statement:控制语句,如if、while语句等
③、compound statement:组合语句
④、input statement:输入语句
⑤、outprint statement:输出语句,如print,printf
⑤.1、输出语句--print:
语法格式:print item1,item2,...
解释:多个字段(item)以逗号分隔,否则输出时是合并在一起输出的;
输出的各item字段可以是字符、数值、当前记录的字段变量或awk的表达式;
如果省略item,则输出整行内容,相当于打印"$0"
print示例:
[root@localhost ~]# tail -3 /etc/fstab | awk '{print "hello:" $1,$2}'
hello:UUID=43446f03-00c0-4d49-a4f3-2050cecfff9e /boot
hello:/dev/mapper/cl-swap swap
[root@localhost ~]# tail -3 /etc/fstab | awk '{print "hello: $1,$2"}' //print后放在双引号中的内容不会被替换成其他数值。
hello:/dev/mapper/cl-root /
hello: $1,$2
hello: $1,$2
hello: $1,$2
[root@localhost ~]#
⑤.2、输出语句--printf:格式化输出
语法格式:printf FORMAT,item1,item2,... //format为格式符,它会为每个item占一个位置,item的数值会套用format中定义的格式。
语法要点:
FORMAT必须给出
printf不会自动换行,如要换行,需要显式给出换行控制符"\n"
FORMAT中需要分别为后面的每个item指定一个格式化符号
FORMAT格式符介绍:
%c:显式字符的ASCII码
%d或%i:显式为十进制的整数
%e或%E:科学计数法数值显式
%f:显式为浮点数
%g或%G:以科学计数法或浮点形式显示数值
%s:显示为字符串
%u:显示为无符号整数
%%:显示%自身
printf示例:
3.3、awk的变量介绍:
内建变量: FS:input filed Seperate,输入片段分隔符,默认为空白字符 OFS:output filed seperate,输出片段分隔符,默认为空白字符 示例:[root@localhost ~]# awk -v FS=':' '{print $1,$2}' /etc/passwd //指定输入分隔符为: ,然后打印出每行的第一个和第二个分片部分 [root@localhost ~]# awk -F: '{print $1}' /etc/passwd //直接用—F选项指定分隔符: [root@localhost ~]# awk -v FS=':' -v OFS=':' '{print $1,$2}' /etc/passwd //指定输入分隔符和输出分隔符,每个-v选项定义一个变量 RS:input record Seperate:指定输入时的换行符,很少用到 ORS:outpunt reccord seperate:指定输出时的换行符,很少用到 示例:[root@localhost ~]# head -1 /etc/passwd | awk -v RS=':' '{print $0}' //指定输入时的换行符为: [root@localhost ~]# head -1 /etc/passwd | awk -v RS=':' -v ORS='#' '{print $0}' //指定输入时的换行符为:,输出换行符# NF:number of filed,统计每一行分片后的分片个数 示例:[root@localhost ~]# head -1 /etc/passwd | awk -v FS=':' '{print NF}' //统计以':'分隔后分片字段个数,结果为7,注意此处的NF不要加$符号 [root@localhost ~]# head -1 /etc/passwd | awk -v FS=':' '{print $NF}' //如果NF前加上$符号,表示引用每行的最后一个分片字段,相当于$7; 注意:awk中引用变量时不要加$符号,但是引用分片字段时要加$符号。 NR:number of reord:统计行数(会显示每一行的行号,如果有多个文件会统一编号) 示例:[root@localhost ~]# awk '{print NR,$1}' /etc/fstab //统计文件有多少行 [root@localhost ~]# awk '{print NR,$1}' /etc/fstab /etc/issue //有多个文件时会统一编号 FNR:number of reord:统计行数(会显示每一行的行号,如果有多个文件不会统一编号) 示例:[root@localhost ~]# awk '{print FNR,$1}' /etc/fstab /etc/issue //有多个文件时不会统一编号 FILENAME:显示被处理的文件名称,即被awk处理的文件的名称 示例:[root@localhost ~]# awk '{print FILENAME}' /etc/issue //会每行显示一个文件名 ARGC:bash命令行参数的个数 ARGV:数组,保存的是bash命令行所给定的各参数 示例:[root@localhost ~]# awk 'BEGIN{print ARGC}' /etc/issue //ARGC统计命令行给的参数个数 2 [root@localhost ~]# awk 'BEGIN{print ARGV[0]}' /etc/issue //引用bash命令行保存的数组参数 awk [root@localhost ~]# awk 'BEGIN{print ARGV[1]}' /etc/issue /etc/issue [root@localhost ~]# awk 'BEGIN{print ARGV[2]}' /etc/issue |
自定义变量:
方法一:-v var=value //var为变量名,value是变量值;需要注意的是:awk中的变量名区分大小写
示例:
[root@localhost ~]# awk -v test='hello magedu' '{print test}' /etc/issue //print后此处引用变量不要加$符号
hello magedu
hello magedu
hello magedu
方法二:在program中直接定义:
示例:
[root@localhost ~]# awk '{test="hello magedu";print test}' /etc/issue //多个语句间用分号分隔。
hello magedu
hello magedu
hello magedu
[root@localhost ~]#
标签:asc grep ons etc 自动 命令行 选项 $0 令行
原文地址:http://blog.51cto.com/10631377/2063616