博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
awk命令基础操作
阅读量:7042 次
发布时间:2019-06-28

本文共 4387 字,大约阅读时间需要 14 分钟。

内建变量

FS:输入分割符

OFS:输出分割符

-v 自定义变量

awk -F: -v OFS=':' '{print $1,$3}' /etc/passwd

RS:输入换行符

ORS:输出换行符

#使用内置变量不需要加$符,$1,$2打印字段是$

NF:显示每行的字段数,就是以空白分割有多少个字段。

NR:显示行号

FNR:分开显示文件行号

#awk '{print NF}' /etc/fstab 

0

1

2

10

1

9

12

注:awk '{print $NF}' /etc/fstab

本来第二行有1个字段,$NF就相当于打印$1.

#NR相当于打印文件的行号,文件总共15行。

$ awk '{print NR}' /etc/fstab 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

 

$ awk '{print NR}' /etc/issue

1

2

3

#NR后面跟2个文件,统计2个文件共多少行。

[ody@vm10-10-254-2 ~]$ awk '{print NR}' /etc/issue /etc/fstab 

1

2

3

4

5

6

7

8

9

10

11

12

#分开统计文件行数:

 awk '{print FNR}' /etc/issue /etc/fstab 

1

2

3 #第一个文件三行

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15 #第二个文件15行

ARGC:awk参数的个数

ARGV:打印awk各参数

[root@192 ~]# awk '{print ARGC}' /etc/fstab  /etc/passwd

3

3

3

3

3

[root@192 ~]# awk 'BEGIN{print ARGC}' /etc/fstab  /etc/passwd

3

[root@192 ~]# awk 'BEGIN{print ARGV[0]}' /etc/fstab  /etc/passwd

awk

[root@192 ~]# awk 'BEGIN{print ARGV[1]}' /etc/fstab  /etc/passwd

/etc/fstab

[root@192 ~]# awk 'BEGIN{print ARGV[2]}' /etc/fstab  /etc/passwd

/etc/passwd

[root@192 ~]# awk 'BEGIN{print ARGV[3]}' /etc/fstab  /etc/passwd

自定义变量:

1、-v var=value

各变量区分大小写

2、在program中直接定义:

#awk -v test='hello world' 'BEGIN{print test}'

hello world

printf命令

格式化输出:print FORMAT,item1 item2

1、FORMAT必须给出

2、不会自动换行,需要显示给出换行控制符,\n

3、FORMAT中需要分别为后面的每个item指定一个格式化符号;

格式符:

%c:显示字符的ASCII码;

%d,%i:显示十进制证书

%e,%E:科学技术显示

%f:为浮点数

%g,%G:以科学计数法或浮点数形式显示数值

%s:显示字符串

%u:无符号整数

%%:显示%自身

修饰符:

#[.#]:第一个数字控制显示的宽度;第二个#表示小数点后的精度。

%3.1f

-:左对齐

+:显示数值的符号

[root@192 ~]# awk -F: -v OFS=':' '$3>=1000{print $1,$3}' /etc/passwd

nfsnobody:65534

使用模式~匹配,匹配的字符串需要使用双斜线括起来。

[root@192 ~]# awk -F: '$NF~/bash$/{print $1,$NF}' /etc/passwd

root /bin/bash

mysql /bin/bash

ody /bin/bash

meng /bin/bash

/stratline/,/endline/匹配从哪开始到那结束

注意:不支持直接给出数字格式

[root@localhost ~]# awk -F: 'NR>=2&&NR<=10''{print $1}' /etc/passwd

bin

daemon

adm

lp

sync

shutdown

halt

mail

uucp

#if语句

[root@localhost ~]# awk -F: '{if ($3>=1000) print $1,$3}' /etc/passwd

nfsnobody 65534

if else 循环:

awk -F: '{if ($3>=1000) {printf "Comon user: %s\n",$1} else {printf "System user: %s\n",$1}}' /etc/passwd

 awk -F: '{if($NF=="/bin/bash") print $1}' /etc/passwd

 

 while循环:

源文件内容:

[root@192 ~]# cat /etc/grub.conf 

# grub.conf generated by anaconda

#

# Note that you do not have to rerun grub after making changes to this file

# NOTICE:  You have a /boot partition.  This means that

#          all kernel and initrd paths are relative to /boot/, eg.

#          root (hd0,0)

#          kernel /vmlinuz-version ro root=/dev/mapper/VolGroup-lv_root

#          initrd /initrd-[generic-]version.img

#boot=/dev/sda

default=0

timeout=5

splashimage=(hd0,0)/grub/splash.xpm.gz

hiddenmenu

title CentOS (2.6.32-431.el6.x86_64)

root (hd0,0)

kernel /vmlinuz-2.6.32-431.el6.x86_64 ro root=/dev/mapper/VolGroup-lv_root rd_NO_LUKS rd_NO_MD rd_LVM_LV=VolGroup/lv_swap crashkernel=auto LANG=zh_CN.UTF-8 rd_LVM_LV=VolGroup/lv_root  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet

initrd /initramfs-2.6.32-431.el6.x86_64.img

[[:space:]] 以空格开头

* 多个空格

/^[[:space:]]*initrd/  以多个空格开始的inited的行,做while循环打印$i,每列的字符数。

 [root@192 ~]# awk '/^[[:space:]]*initrd/{i=1;while(i<=NF) {print $i,length($i);i++}}' /etc/grub.conf 

initrd 6

/initramfs-2.6.32-431.el6.x86_64.img 36

for循环:

[root@192 ~]# awk '/^[[:space:]]*initrd/{for(i=1;i<=NF;i++) {print $i,length($i)}}' /etc/grub.conf 

initrd 6

/initramfs-2.6.32-431.el6.x86_64.img 36

break和continue  控制循环的

break [n]  跳出本次循环

continue  结束本轮循环,进入下轮循环

next

提前结束对本行的处理而直接进入下一行。

打印uid为偶数的行 。

如果不等于0,就结束对本行的处理next,等于0就不符合匹配,直接进入下一行。 

[root@192 ~]# awk -F: '{if ($3%2!=0) next; print $1,$3}'  /etc/passwd

root 0

daemon 2

lp 4

shutdown 6

mail 8

数组:

遍历数组中的每个元素,使用for循环:

for (war in arry) {for-body}

注意:var会遍历arry中的每个索引:

state["LISTEN"] 定义这个数组元素第一次从0开始

state["LISTEN"]++  第一行++ 就是1,第二行就是在1的基础上++ 就是2 ......

for 循环遍历数组中的每个元素,state[i] 打印每行元素的个数

END 只对最后一行做统计,

无END效果如下:

[root@192 ~]# netstat -ant | awk '/^tcp/''{state[$NF]++} {for (i in state) print i,state[i]}'

LISTEN 1

LISTEN 2

LISTEN 3

LISTEN 4

LISTEN 5

[root@192 ~]# netstat -ant | awk '/^tcp\>/{state[$NF]++}END{for (i in state) {print i,state[i]}}'

ESTABLISHED 1

LISTEN 9

[root@192 ~]# ss -ant | awk '{s[$1]++} END {for (i in s) print i,s[i]}'

ESTAB 2

State 1

LISTEN 9

函数:

内置函数:

rand():返回0和1之间的一个随机数

字符串处理:

length([s]):返回指定字符串的长度

split(s,a[,r]):以r为分割符切割字符s,并将切割后的结果保存至a所表示的数组中:

[root@192 ~]# echo $alllist

192.168.1.1,192.168.1.2

[root@192 ~]# awk 'BEGIN{s="'$alllist'";split(s,ip,",");for(i in ip) print ip[i]}'

192.168.1.1

192.168.1.2

转载地址:http://nital.baihongyu.com/

你可能感兴趣的文章
配置samba服务
查看>>
查找对话框实现
查看>>
Microsoft活动目录的作用以及优势
查看>>
小五思科技术学习笔记之单区域OSPF
查看>>
Hyper-V Server存储介绍
查看>>
[图示]神相的‘敏捷项目管理’
查看>>
更换云服务器上的Python版本
查看>>
Skype for Business Server 2015-04-前端服务器-7-部署
查看>>
你的Postfix邮件服务器安全么?
查看>>
站在巨人肩膀看清IT馅饼和陷阱
查看>>
Android系统匿名共享内存(Anonymous Shared Memory)C++调用接口分析(4)
查看>>
Windows 7 的一些使用技巧
查看>>
Spring Boot中使用Redis数据库
查看>>
完整性检查工具Nabou
查看>>
Exchange企业实战技巧(26)在Outlook中打开多个邮箱
查看>>
一个Linux小型综合实验
查看>>
软件定义架构让超融合世界更加复杂
查看>>
Wi-Fi当前的趋势及对IT和物联网的影响
查看>>
服务器遭受攻击后 该如何有效地处理?
查看>>
未来 Web 设计的 7 大趋势
查看>>