linux中awk基本用法,linux操作系统-awk基本用法

gawk (gnu awk)

Unix中awk的GNU版本,完成grep和sed的工作

支持数学运算,流程该控制内置大量的变量和函数

awk命令工作原理:

与sed一样, 均是一行一行的读取、处理

sed作用于一整行的处理, 而awk将一行分成数个字段来处理

awk的数据字段变量:

$0表示整行文本

$1表示文本中第一个数据字段

$2表示文本中第二个数据字段

$n表示文本中第n个数据字段

awk的用-F来指定分隔符:

默认的字段分隔符是任意空白字符(空格或者TAB)

举例对比cut和awk的区别

awk的命令的执行过程:

执行BEGIN{commands}语句块中的语句

从文件或stdin中读取第1行,

有无模式匹配, 若无则执行{}中的语句,

若有则检查该整行与pattern是否匹配, 若匹配, 则执行{}中的语句,

若不匹配则不执行{}中的语句,接着读取下一行

重复这个过程, 直到所有行被读取完毕

执行END{commands}语句块中的语句

awk命令的基本语法:

awk -F 分隔符  ‘/模式/{动作}’  输入文件

awk的指令一定要用单引号括起

awk的动作一定要用花括号括起

模式可以是正则表达式、条件表达式或两种组合

如果模式是正则表达式要用/定界符

多个动作之间用;号分开

awk基本命令示例:

awk '/bash/' /etc/passwd

只有模式没有动作结果和grep一样,显示$0

who | awk '{print $2}‘

只有动作没有模式就直接执行动作

awk -F: '/^h/{print $1,$7}' /etc/passwd

print执行显示功能将文本输出到STDOUT

以冒号为分隔符,显示以h开头的行的第一列和第七列

awk -F: '/^[^h]/{print $1,$7}' /etc/passwd

不显示以h开头的行的第一列和第七列

awk -F '[:/]' '{print $1,$10}' /etc/passwd

以:或者/作为分隔符显示第1列和第10列

awk命令的操作符:

正则表达式和bash一致

数学运算:+,-,*,/, %,++,- -

逻辑关系符:&&, ||, !

比较操作符:>,=,!=,<=,==  ~ !~

文本数据表达式:== (精确匹配)

~波浪号表示匹配后面的模式

who | awk '$2 ~ /pts/{print $1}‘

awk -F: '$3 ~ /\<...>/ {print $1,$3}' /etc/passwd

seq 100 | awk '$1 % 5 == 0 || $1 ~ /^1/{print $1}'

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

awk基本命令示例:

awk -F: '$3>=500{print $1}' /etc/passwd

显示UID大于等于500行的用户名

awk -F: '$3>=500 && $3<=60000{print $1}' /etc/passwd

显示普通用户名

awk -F: '$3 != $4 {print $1}' /etc/passwd

显示UID不等于GID的用户名

awk -F: '/^h/ && /bash/{print $1}' /etc/passwd

显示用户名以h开头且包含hash字段的普通用户

ps aux | awk '$2 <=10 {print $11}'

awk 'BEGIN{print "line one\nline two\nline three"}'

显示后面三行

awk 'END{print "line one\nline two\nline three"}'

按ctrl+D开始显示后面三行

awk 'BEGIN{print "start..."}{print $1}END{print "end..."}' test

显示文件的内容并在前面加上start和后面加上end

awk 'BEGIN{i=0}{i++}END{print i}' /etc/passwd

显示文件的行数

awk '{print NF}' /etc/grub.conf

显示每行的字段数目

awk '{print $1,$NF}' /etc/grub.conf

显示每行的第一字段 和最后一个字段

awk '{print NR,$0}' /etc/grub.conf

显示每行的内容和行号

awk -F: 'BEGIN{OFS="---"}{print $1,$7}' /etc/passwd

显示第一列和第七列,中间用---隔开

awk 'BEGIN{FS=":"}/bash$/{print NR,$1}END{print NR}' /etc/passwd

显示符合模式的用户名和所在的行号最后显示总行号

awk基本命令示例:

awk ‘NR==3,NR=5’ /etc/grub.conf

显示文件的3到5行

awk   'NR<=10' /etc/fstab

显示文件的前10行

分析下面三条命令的区别,为什么

awk 'BEGIN{print NR}' /etc/passwd    0

awk '{print NR}' /etc/passwd       总行数

awk 'END{print NR}' /etc/passwd  总行数

分析下面命令的执行结果

awk -F: '{print $NR}' /etc/passwd

[root@localhost lianxi]# awk -F: '{print $NR}' passwd

root

x

2

4

lp

/sbin

/sbin/shutdown

[root@localhost lianxi]#

awk -F: '{print NR, NF, $1, $NF, $(NF-1)}' /etc/passwd

[root@localhost lianxi]# awk -F: '{print NR, NF, $1, $NF, $(NF-1)}' /etc/passwd

1 7 root /bin/bash /root

2 7 bin /sbin/nologin /bin

3 7 daemon /sbin/nologin /sbin

4 7 adm /sbin/nologin /var/adm

5 7 lp /sbin/nologin /var/spool/lpd

6 7 sync /bin/sync /sbin

7 7 shutdown /sbin/shutdown /sbin

8 7 halt /sbin/halt /sbin

9 7 mail /sbin/nologin /var/spool/mail

10 7 uucp /sbin/nologin /var/spool/uucp

11 7 operator /sbin/nologin /root

12 7 games /sbin/nologin /usr/games

13 7 gopher /sbin/nologin /var/gopher

14 7 ftp /sbin/nologin /var/ftp

15 7 nobody /sbin/nologin /

16 7 dbus /sbin/nologin /

17 7 usbmuxd /sbin/nologin /

18 7 rpc /sbin/nologin /var/cache/rpcbind

19 7 vcsa /sbin/nologin /dev

20 7 rtkit /sbin/nologin /proc

21 7 abrt /sbin/nologin /etc/abrt

22 7 avahi-autoipd /sbin/nologin /var/lib/avahi-autoipd

23 7 saslauth /sbin/nologin /var/empty/saslauth

24 7 postfix /sbin/nologin /var/spool/postfix

25 7 haldaemon /sbin/nologin /

26 7 gdm /sbin/nologin /var/lib/gdm

27 7 ntp /sbin/nologin /etc/ntp

28 7 apache /sbin/nologin /var/www

29 7 mysql /bin/bash /var/lib/mysql

30 7 rpcuser /sbin/nologin /var/lib/nfs

31 7 nfsnobody /sbin/nologin /var/lib/nfs

32 7 pulse /sbin/nologin /var/run/pulse

33 7 sshd /sbin/nologin /var/empty/sshd

34 7 tcpdump /sbin/nologin /

35 7 squid /sbin/nologin /var/spool/squid

36 7 named /sbin/nologin /var/named

37 7 tss /sbin/nologin /dev/null

38 7 ldap /sbin/nologin /var/lib/ldap

39 7 wl /bin/bash /home/wl

只显示df -h结果的第一列文件系统

显示passwd文件的第5行和第10行的行号和用户名

使用NF变量显示passwd文件倒数第二列的内容

awk -F: '{print $(NF-1)}' passwd

显示passwd文件中第5到第10行的用户名

awk -F: 'NR==1,NR==10 {print $1}' passwd

显示passwd文件中第7列不是bash的用户名

awk -F: '/nologin$/{print $1}' passwd

显示passwd文件中行号是5结尾的行号和行

awk -F: 'NR==5{print NR,$0}' passwd

用ifconfig只显示ip(不能使用tr或者cut命令)

ifconfig eth0 |awk -F: 'NR==2{print $2}' |awk -F' ' '{print $1}'

使用awk显示eth0的入站流量和出站流量(字节)

ifconfig eth0 |awk -F" " 'NR==8{print $3,$4,$7,$8}'

使用awk命令统计以r开头的用户数目,显示如下效果

查找结果

root

rpc

rtkit

rpcuser

4

awk命令的引用shell变量:

-v 引入shell变量

#!/bin/bash

name=haha

echo | awk '{print $name}'

#!/bin/bash

name=haha

echo |awk -v abc=$name '{print abc,$name}'

awk编程语言内置了很多函数:

例如利用length计算字符数目的函数来检查有无空口令用户

awk -F: 'length($2)==0{print $1}' /etc/passwd /etc/shadow

显示文件中超过60个字符的行

wk 'length($0)>60 {print NR,$0}' /etc/passwd

if语句

单分支

if (condition)statement1

awk -F: '{if($1 ~ /\<...>/)print $0}' /etc/passwd

awk -F: '{if($3 >= 500)print $1,$7}' /etc/passwd

双分支

if (condition)statement1 ;else statement2

awk -F: '{if($3 != 0) print $1 ; else print $3}' /etc/passwd

多分支

awk -F: '{if($1=="root") print $1; else if($1=="ftp") print $2; else if($1=="mail") print $3; else print NR}' /etc/passwd

利用awk的system命令在/tmp下建立/etc/passwd中与用户名同名的目录:

awk -F: '{system("mkdir /tmp/"$1)}' /etc/passwd

awk -F" " '{if (length($7)>60) {print NR,$3,$4,$5,$6,substr($7 1,55)} else {print NR,$3,$4,$5,$6,$7}}' wl.txt     取前55个

awk进行列求和:统计/etc目录下以.conf结尾的文件的总大小find /etc/ -type f -name "*.conf" |xargs ls -l | awk '{sum+=$5} END{print sum}‘如果要匹配第一列的才累加,需要用到awk的数组和for循环cat xferlog | cut -d' ' -f7,8 | sort -n > /tmp/file1awk '{a[$1]+=$2}END{for(i in a) print i"  "a[i]/1024/1024}' /tmp/file1 | sort -rn -k2awk进行行求和echo 1 2 3 4 5 | awk '{for(i=1;i<=NF;i++) sum+=$i; print sum}‘seq -s ' ' 100 | awk '{for(i=1;i<=NF;i++) sum+=$i; print sum}'

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值