1.ASP站长网 命令格式
gawk [OPTIONS] 'program' FILES....
program:'PATTERN{ACTION}'
一条awk命令中,PATTERN和ACTION,至少存在一个才可执行;
缺少PATTERN,则对输入行内容全部执行ACTION;
缺少ACTION,则所有匹配上PATTERN的输入行都会被输出;
在awk中使用分号“;”来分割语句;
2. awk的执行过程
awk读取一行,进行模式匹配,匹配了就执行相应的动作,没有匹配就忽略,读取下一行,重复此动作.
3. 内置变量
FS:输入文件的field分隔符,默认是空白字符;
OFS:输出文件的field分隔符,默认是空白字符;
RS:输入文件record分隔符,默认是\n;
ORS:输入文件record分隔符,默认是\n;
NF:每行的field数量,{print NF}表示显示当前行的field数量,{print $NF}表示显示当前行的最后一个field;
NR:record数,对所有输入行进行统一排序;
FNR:record数,对每个文件的输入行进行分别排序;
FILENAME:输入文件的名字;
ARGC:命令行中的参数个数;
ARGV:数组,可以将当前命令行中的参数分别加入到ARGV这个数组中,从0开始;
$1、$2、$3...$n:代表当前行中对应的field
4. 常用OPTION
-F:指定输入分隔符;
-v:指定awk的变量;像FS、OSF、RS、ORS这些变量,就可以使用-v进行重新赋值;
5. 双引号的作用
定义一个变量superuser的值为root,但是打印的时候,发现打印出了一个空行,并没有实际内容
[root@CentOS7 ~]# awk 'BEGIN{superuser=root;print superuser}'
空行......
这是因为只有加上了双引号才会被awk认为是字符串,否则会被认为是变量。在上面这个例子中,想要为superuser赋值的是root字符串,但是因为没有加上双引号,被awk认为root也是一个变量,但是awk中又不存在这个变量,所以最终为superuser的变量内容就是空。
所以在awk中定义变量应该是这种情况:
[root@centos7 ~]# awk 'BEGIN{superuser="root";print superuser}'
root
使用-v参数就没有上面的限制
[root@centos7 ~]# awk -v superuser=root 'BEGIN{print superuser}'
root
6. ACTION
6.1 printf命令:按照指定的FORMAT进行格式化输出;
格式化输出:printf FORMAT, item1, item2, ...
FORMAT:FORMAT是一个字符串, 它包含按字面打印的文本, 中间散布着格式说明符, 格式说明符用于说明如何打印值. 一个格式说明符是一个%, 后面跟着几个字符, 这些字符控制一个value 的输出格式. 第一个格式说明符说明item1 的输出格式, 第二个格式说明符说明item2 的输出格式, 依次类推. 于是, 格式说明符的数量应该和被打印的item 一样多;
printf不会自动产生换行符,必须手动创建;
格式符
%s:显示字符串;
%i,%d:显示十进制整数;
修饰符
#[.#]:第一个#控制显示的宽度,第二个#表示小数点后的精度;
例如:%3.1f
-减号:左对齐(不加减号,默认为右对齐);
+加号:显示数值的符号;
实例
例如:使用printf打印/etc/passwd中的$1和$3
[Allen@centos7 ~]$ head /etc/passwd | awk -F: '{printf "Username: %-12sUID: %-8i\n",$1,$3}'
Username: root UID: 0
Username: bin UID: 1
Username: daemon UID: 2
Username: adm UID: 3
Username: lp UID: 4
Username: sync UID: 5
Username: shutdown UID: 6
Username: halt UID: 7
Username: mail UID: 8
Username: operator UID: 11
大型站长资讯类网站! https://www.0792zz.cn