linux下文本处理三剑客学习汇总:grep、sed、awk

grep:命令主要对文本的(正则表达式)行基于模式进行过滤

sed:stream editor,文本编辑工具

awk:Linux上的实现gawk,文本报告生成器

文本处理三剑客之 grep

grep: Global search REgular expression and Print out the line

作用:文本搜索工具,根据用户指定的“模式”对目标文本逐行进行匹配检查;打印匹配到的行

模式:由正则表达式字符及文本字符所编写的过滤条件

格式:

grep [OPTIONS] PATTERN [FILE...]

常见选项:

范例:

grep root /etc/passwd
grep "USER" /etc/passwd
grep 'USER' /etc/passwd
grep whoami /etc/passwd

范例:

df | grep '^/dev/sd' |tr -s ' ' %|cut -d% -f5|sort -n|tail -1

范例:

[root@centos8 ~]#ss -nt | grep "^ESTAB" |tr -s ' ' : |cut -d: -f6|sort |uniq -
c|sort -nr|head -n3
      3 10.0.0.1
      1 172.16.4.100
      1 172.16.31.188

范例:

[root@centos8 ~]#grep -v "^#" /etc/profile | grep -v '^#39;
[root@centos8 ~]#grep -v "^#|^#34; /etc/profile
[root@centos8 ~]#grep -v "^(#|$)" /etc/profile 
[root@centos8 ~]#grep -Ev "^(#|$)" /etc/profile
[root@centos8 ~]#egrep -v "^(#|$)" /etc/profile
[root@centos6 ~]#egrep -v '^(#|$)' /etc/httpd/conf/httpd.conf|wc -l

范例:

[root@centos8 ~]#grep -o 'r..t' /etc/passwd
root
root
root
root
r/ft
rypt

范例:

[root@centos8 ~]#ifconfig | grep -E '[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]
{1,3}'
       inet 10.0.0.8 netmask 255.255.255.0 broadcast 10.0.0.255
       inet 172.16.0.123 netmask 255.255.0.0 broadcast 172.16.255.255
       inet6 fe80::c11e:4792:7e77:12a4 prefixlen 64 scopeid 0x20
       inet 127.0.0.1 netmask 255.0.0.0
[root@centos8 ~]#ifconfig | grep -E '([0-9]{1,3}.){3}[0-9]{1,3}'
       inet 10.0.0.8 netmask 255.255.255.0 broadcast 10.0.0.255
       inet 172.16.0.123 netmask 255.255.0.0 broadcast 172.16.255.255
       inet6 fe80::c11e:4792:7e77:12a4 prefixlen 64 scopeid 0x20
       inet 127.0.0.1 netmask 255.0.0.0
[root@centos8 ~]#ifconfig | grep -Eo '([0-9]{1,3}.){3}[0-9]{1,3}'|head -1
10.0.0.8
[root@centos8 ~]#cat regex.txt 
([0-9]{1,3}.){3}[0-9]{1,3}
[root@centos8 ~]#ifconfig | grep -oEf regex.txt 
10.0.0.8
255.255.255.0
10.0.0.255
9731947
127.0.0.1
255.0.0.0

范例:

[root@centos8 ~]#grep -E 'root|bash' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
wang:x:1000:1000:wang:/home/wang:/bin/bash
mage:x:1001:1001::/home/mage:/bin/bash
xiaoming:x:1002:1002::/home/xiaoming:/bin/bash
roob:x:1003:1003::/home/roob:/bin/bash
[root@centos8 ~]#grep -e 'root' -e 'bash' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
wang:x:1000:1000:wang:/home/wang:/bin/bash
mage:x:1001:1001::/home/mage:/bin/bash
xiaoming:x:1002:1002::/home/xiaoming:/b

范例:

[root@centos8 ~]#grep -w root /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@centos8 ~]#grep '

范例:

[root@centos8 ~]#grep "^(.*)>.*<1#34; /etc/passwd
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
bash:x:1008:1008::/home/bash:/bin/bash
nologin:x:1011:1011::/home/nologin:/sbin/nologin
[root@centos8 ~]#grep -E "^(.*)>.*<1#34; /etc/passwd
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
bash:x:1008:1008::/home/bash:/bin/bash
nologin:x:1011:1011::/home/nologin:/sbin/nologin
[root@centos8 ~]#egrep "^(.*)>.*<1#34; /etc/passwd
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
bash:x:1008:1008::/home/bash:/bin/bash
nologin:x:1011:1011::/home/nologin:/sbin/nologin

文本处理三剑客之 sed

1.sed 工作原理

sed 即 stream EDitor,和 vi 不同,sed是行编辑器

linux下文本处理三剑客学习汇总:grep、sed、awk

Sed是从文件或管道中读取一行,处理一行,输出一行;再读取一行,再处理一行,再输出一行,直到最后一行。每当处理一行时,把当前处理的行存储在临时缓冲区中,称为模式空间(PatternSpace),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。一次处理一行的设计模式使得sed性能很高,sed在读取大文件时不会出现卡顿的现象。如果使用vi命令打开几十M上百M的文件,明显会出现有卡顿的现象,这是因为vi命令打开文件是一次性将文件加载到内存,然后再打开。Sed就避免了这种情况,一行一行的处理,打开速度非常快,执行速度也很快

参考网站:http://www.gnu.org/software/sed/manual/sed.html

2.sed 基本用法

格式:

sed [option]... 'script;script;...' inputfile...

常用选项:

  • -n 不输出模式空间内容到屏幕,即不自动打印
  • -e 多点编辑
  • -f /PATH/SCRIPT_FILE 从指定文件中读取编辑脚本
  • -r, -E 使用扩展正则表达式
  • -i.bak 备份文件并原处编辑

script格式:

'地址命令'

地址格式:

1. 不给地址:对全文进行处理
2. 单地址:
   #:指定的行,$:最后一行
   /pattern/:被此处模式所能够匹配到的每一行
3. 地址范围:
   #,#
   #,+#
   /pat1/,/pat2/
   #,/pat/
4. 步进:~
     1~2 奇数行
     2~2 偶数行

命令:

p 打印当前模式空间内容,追加到默认输出之后
d 删除模式空间匹配的行,并立即启用下一轮循环
a []text 在指定行后面追加文本,支持使用
实现多行追加
i []text 在行前面插入文本
c []text 替换行为单行或多行文本
w /path/file 保存模式匹配的行至指定文件
r /path/file 读取指定文件的文本至模式空间中匹配到的行后
= 为模式空间中的行打印行号
! 模式空间中匹配行取反处理
s/pattern/string/修饰符 查找替换,支持使用其它分隔符,可以是其它形式:s@@@,s###
替换修饰符:
g 行内全局替换
p 显示替换成功的行
w   /PATH/FILE 将替换成功的行保存至文件中

范例:

[root@centos8 ~]#sed '' 
welcome
welcome
to
to
magedu
magedu
 
[root@centos8 ~]#sed '' /etc/issue
S
Kernel r on an m

[root@centos8 ~]#sed 'p' /etc/issue
S
S
Kernel r on an m
Kernel r on an m
 
[root@centos8 ~]#sed -n '' /etc/issue
[root@centos8 ~]#sed -n 'p' /etc/issue
 S
Kernel r on an m
 
[root@centos8 ~]#sed -n '1p' /etc/passwd
root:x:0:0:root:/root:/bin/bash

[root@centos8 ~]#ifconfig eth0 | sed '2p'
eth0: flags=4163 mtu 1500
       inet 10.0.0.8 netmask 255.255.255.0 broadcast 10.0.0.255
       inet 10.0.0.8 netmask 255.255.255.0 broadcast 10.0.0.255
       inet6 fe80::20c:29ff:fe45:a8a1 prefixlen 64 scopeid 0x20
       ether 00:0c:29:45:a8:a1 txqueuelen 1000 (Ethernet)
       RX packets 89815 bytes 69267453 (66.0 MiB)
       RX errors 0 dropped 0 overruns 0 frame 0
       TX packets 115634 bytes 79827662 (76.1 MiB)
       TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

[root@centos8 ~]#ifconfig eth0 | sed -n '2p'
       inet 10.0.0.8 netmask 255.255.255.0 broadcast 10.0.0.255
        
[root@centos8 ~]#sed -n '$p' /etc/passwd
postfix:x:89:89::/var/spool/postfix:/sbin/nologin

[root@centos8 ~]#ifconfig eth0 |sed -n '/netmask/p'
       inet 10.0.0.8 netmask 255.255.255.0 broadcast 10.0.0.255
 
[root@centos8 ~]#df | sed -n '/^/dev/sd/p'
/dev/sda2      104806400 4872956  99933444   5% /
/dev/sda3       52403200  398860  52004340   1% /data
/dev/sda1         999320  848568     81940  92% /boot

[root@centos8 ~]#seq 10 | sed -n '3,6p'
3
4
5
6
[root@centos8 ~]#seq 10 | sed -n '3,+4p'
3
4
5
6
7

[root@centos8 ~]#seq 10 | sed -n '3,$p'
3
4
5
6
7
8
9
10
 
[root@centos8 ~]#seq 10 |sed -n '1~2p'
1
3
5
7
9

[root@centos8 ~]#seq 10 |sed -n '2~2p'
2
4
6
8
10
[root@centos8 ~]#seq 10 |sed   '1~2d'
2
4
6
8
10

[root@centos8 ~]#seq 10 |sed   '2~2d'
1
3
5
7
9
[root@centos8 ~]#sed -e '2d' -e '4d' seq.log
1
3
5
6
7
8
9
10
[root@centos8 ~]#sed '2d;4d' seq.log
1
3
5
6
7
8
9
10
[root@centos8 ~]#sed -i.orig '2d;4d' seq.log
[root@centos8 ~]#cat seq.log.orig
1
2
3
4
5
6
7
8
9
10
[root@centos8 ~]#cat seq.log
1
3
5
6
7
8
9
10
[root@centos8 ~]#seq 10 > seq.log 
[root@centos8 ~]#sed -i.orig '2d;4d' seq.log

[root@centos8 ~]#sed -i   '/^listen 9527/a listen 80 
listen 8080' 
/etc/httpd/conf/httpd.conf
 
#删除所有以#开头的行
[root@centos8 ~]#sed -i '/^#/d' fstab

#只显示非#开头的行
[root@centos8 ~]#sed -n '/^#/!p' fstab

范例:

sed '2p' /etc/passwd
sed  -n '2p' /etc/passwd
sed  -n '1,4p' /etc/passwd
sed  -n '/root/p' /etc/passwd
sed  -n '2,/root/p' /etc/passwd 从2行开始
sed  -n '/^$/=' file 显示空行行号
sed  -n  -e '/^$/p' -e '/^$/=' file
Sed'/root/asuperman' /etc/passwd行后
sed '/root/isuperman' /etc/passwd 行前
sed '/root/csuperman' /etc/passwd 代替行
sed '/^$/d' file
sed '1,10d'   file
nl   /etc/passwd | sed '2,5d'
nl   /etc/passwd | sed '2a tea'
sed 's/test/mytest/g' example
sed -n 's/root/&superman/p' /etc/passwd 单词后
sed -n 's/root/superman&/p' /etc/passwd 单词前
sed -e 's/dog/cat/' -e 's/hi/lo/' pets  
sed -i.bak  's/dog/cat/g' pets

范例:取IP 地址

[root@centos8 ~]#ifconfig|sed -nr "2s/[^0-9]+([0-9.]+).*/1/p"  
10.0.0.8
[root@centos8 ~]#ifconfig eth0 | sed -n '2s/^.*inet //p' | sed -n 's/ 
netmask.*//p'
10.0.0.8 
[root@centos8 ~]#ifconfig eth0 | sed -n '2s/^.*inet //;s/ netmask.*//p'
10.0.0.8 
[root@centos8 ~]#ifconfig eth0 | sed -rn '2s/(.*inet )([0-9].*)( 
netmask.*)/2/p' 
10.0.0.8

范例:取基名和目录名

echo "/etc/sysconfig/network-scripts/" |sed -r 's#(^/.*/)([^/]+/?)#2#' 取基名
echo "/etc/sysconfig/network-scripts/" |sed -r 's#(^/.*/)([^/]+/?)#1#' 取目录
#取目录名
[root@centos8 ~]#echo /etc/sysconfig/ | sed -rn 's#(.*)/([^/]+)/?#1#p'
/etc
#取基名
[root@centos8 ~]#echo /etc/sysconfig/ | sed -rn 's#(.*)/([^/]+)/?#2#p'
sysconfig

范例:将非#开头的行加#

[root@centos8 ~]#sed -rn "s/^[^#]/#&/p"   /etc/fstab
#UUID=1b950ef9-7142-46bd-975c-c4ac1e0d47e8 /                           xfs     
defaults       0 0
#UUID=667a4c81-8b4b-4a39-a111-b11cb6d09309 /boot                  ext4   
defaults       1 2
#UUID=38d14714-c018-41d5-922c-49e415decbca /data                   xfs     
defaults       0 0
#UUID=a0efb2bb-8227-4317-a79d-0a70d515046c swap                   swap   
defaults       0 0
 
[root@centos8 ~]#sed -rn 's/^[^#](.*)/#1/p' /etc/fstab
#UID=1b950ef9-7142-46bd-975c-c4ac1e0d47e8 /                           xfs     
defaults       0 0
#UID=667a4c81-8b4b-4a39-a111-b11cb6d09309 /boot                  ext4   
defaults       1 2
#UID=38d14714-c018-41d5-922c-49e415decbca /data                   xfs     
defaults       0 0
#UID=a0efb2bb-8227-4317-a79d-0a70d515046c swap                   swap   
defaults       0 0

[root@centos8 ~]#sed -rn '/^#/!s@^@#@p' /etc/fstab 
#
#UUID=1b950ef9-7142-46bd-975c-c4ac1e0d47e8 /                           xfs     
defaults       0 0
#UUID=667a4c81-8b4b-4a39-a111-b11cb6d09309 /boot                  ext4   
defaults       1 2
#UUID=38d14714-c018-41d5-922c-49e415decbca /data                   xfs     
defaults       0 0
#UUID=a0efb2bb-8227-4317-a79d-0a70d515046c swap                   swap   
defaults       0 0

范例: 将#开头的行删除#

[root@centos8 ~]#sed -ri.bak '/^#/s/^#//' /etc/fstab

范例:取分区利用率

[root@centos8 ~]#df | sed -nr '/^/dev/sd/s# .* ([0-9]+)%.*# 1#p'
/dev/sda2 3
/dev/sda5 1
/dev/sda1 14

范例:修改内核参数

[root@centos8 ~]#sed -nr '/^GRUB_CMDLINE_LINUX/s/"$/ net.ifnames=0"/p' 
/etc/default/grub
GRUB_CMDLINE_LINUX="crashkernel=auto resume=UUID=8363289d-138e-4e4a-abaf-
6e028babc924 rhgb quiet net.ifnames=0"
[root@centos8 ~]#sed -rn '/^GRUB_CMDLINE_LINUX=/s@(.*)"$@1 net.ifnames=0"@p' 
/etc/default/grub
GRUB_CMDLINE_LINUX="crashkernel=auto resume=UUID=a0efb2bb-8227-4317-a79d-
0a70d515046c rhgb quiet net.ifnames=0"
[root@centos8 ~]#sed -rn '/^GRUB_CMDLINE_LINUX=/s@"$@ net.ifnames=0"@p' 
/etc/default/grub
GRUB_CMDLINE_LINUX="crashkernel=auto resume=UUID=a0efb2bb-8227-4317-a79d-
0a70d515046c rhgb quiet net.ifnames=0 net.ifnames=0"

范例:修改网卡名称

[root@centos8 ~]#sed -ri '/^GRUB_CMDLINE_LINUX=/s@"$@ net.ifnames=0"@' 
/etc/default/grub
#centos7,8
[root@centos8 ~]#grub2-mkconfig -o /boot/grub2/grub.cfg 
#ubuntu
[root@ubuntu ~]#grub-mkconfig -o /boot/grub/grub.cfg

范例:查看配置文件

sed  -r  '/^(#|$)/d' /etc/httpd/conf/httpd.conf
sed  -r  '/^#|^$/d' /etc/httpd/conf/httpd.conf

范例:引用变量

[root@centos8 ~]#echo|sed "s/^/$RANDOM.rmvb/"
5242.rmvb
[root@centos8 ~]#echo|sed 's/^/$RANDOM.rmvb/'
$RANDOM.rmvb
[root@centos8 ~]#echo|sed 's/^/'''$RANDOM'''.rmvb/'

范例:修改配置文件

[root@centos6 ~]#sed   -e '/^#/s@#@@' -e 
'/^#NameVirtualHost/s@#@@' /etc/httpd/conf/httpd.conf

3.sed 高级用法

sed 中除了模式空间,还另外还支持保持空间(Hold Space),利用此空间,可以将模式空间中的数据,临时保存至保持空间,从而后续接着处理,实现更为强大的功能。

常见的高级命令

  • P 打印模式空间开端至 内容,并追加到默认输出之前
  • h 把模式空间中的内容覆盖至保持空间中
  • H 把模式空间中的内容追加至保持空间中
  • g 从保持空间取出数据覆盖至模式空间
  • G 从保持空间取出内容追加至模式空间
  • x 把模式空间中的内容与保持空间中的内容进行互换
  • n 读取匹配到的行的下一行覆盖至模式空间
  • N 读取匹配到的行的下一行追加至模式空间
  • d 删除模式空间中的行
  • D 如果模式空间包含换行符,则删除直到第一个换行符的模式空间中的文本,并不会读取新的输入行,而使用合成的模式空间重新启动循环。如果模式空间不包含换行符,则会像发出d命令那样启动正常的新循环

范例:

sed -n 'n;p' FILE
sed '1!G;h;$!d' FILE
sed ‘N;D’FILE
seq 10 |sed  '3h;9G;9!d'
sed '$!N;$!D' FILE
sed '$!d' FILE
sed ‘G’ FILE
sed ‘g’ FILE
sed ‘/^$/d;G’ FILE
sed 'n;d' FILE 
sed -n '1!G;h;$p' FILE

练习:

  1. 删除centos7系统/etc/grub2.cfg文件中所有以空白开头的行行首的空白字符
  2. 删除/etc/fstab文件中所有以#开头,后面至少跟一个空白字符的行的行首的#和空白字符
  3. 在centos6系统/root/install.log每一行行首增加#号
  4. 在/etc/fstab文件中不以#开头的行的行首增加#号
  5. 处理/etc/fstab路径,使用sed命令取出其目录名和基名
  6. 利用sed 取出ifconfifig命令中本机的IPv4地址
  7. 统计centos安装光盘中Package目录下的所有rpm文件的以.分隔倒数第二个字段的重复次数
  8. 统计/etc/init.d/functions文件中每个单词的出现次数,并排序(用grep和sed两种方法分别实现)
  9. 将文本文件的n和n+1行合并为一行,n为奇数行

文本处理三剑客之 awk

1.awk 工作原理和基本用法说明

awk:Aho, Weinberger, Kernighan,报告生成器,格式化文本输出,GNU/Linux发布的AWK目前由自由软件基金会(FSF)进行开发和维护,通常也称它为 GNU AWK

有多种版本:

  • AWK:原先来源于 AT & T 实验室的的AWK
  • NAWK:New awk,AT & T 实验室的AWK的升级版
  • GAWK:即GNU AWK。所有的GNU/Linux发布版都自带GAWK,它与AWK和NAWK完全兼容

gawk:模式扫描和处理语言,可以实现下面功能

  • 文本处理
  • 输出格式化的文本报表
  • 执行算数运算
  • 执行字符串操作

格式:

awk [options]   'program' var=value   file…
awk [options]   -f programfile   var=value file…

说明:

program通常是被放在单引号中,并可以由三种部分组成

  • BEGIN语句块
    模式匹配的通用语句块
    END语句块

常见选项:

  • -F “分隔符” 指明输入时用到的字段分隔符
  • -v var=value 变量赋值

Program格式:

pattern{action statements;..}

pattern:决定动作语句何时触发及触发事件,比如:BEGIN,END

action statements:对数据进行处理,放在{}内指明,常见:print, printf

awk 工作过程

linux下文本处理三剑客学习汇总:grep、sed、awk

第一步:执行BEGIN{action;… }语句块中的语句

第二步:从文件或标准输入(stdin)读取一行,然后执行pattern{ action;… }语句块,它逐行扫描文件,从第一行到最后一行重复这个过程,直到文件全部被读取完毕。

第三步:当读至输入流末尾时,执行END{action;…}语句块

BEGIN语句块在awk开始从输入流中读取行之前被执行,这是一个可选的语句块,比如变量初始化、打印输出表格的表头等语句通常可以写在BEGIN语句块中END语句块在awk从输入流中读取完所有的行之后即被执行,比如打印所有行的分析结果这类信息汇总都是在END语句块中完成,它也是一个可选语句块pattern语句块中的通用命令是最重要的部分,也是可选的。如果没有提供pattern语句块,则默认执行{print },即打印每一个读取到的行,awk读取的每一行都会执行该语句块

分割符、域和记录

  • 由分隔符分隔的字段(列column,域fifield)标记$1,$2...$n称为域标识,$0为所有域,注意:和shell中变量$符含义不同
  • 文件的每一行称为记录record
  • 如果省略action,则默认执行 print $0 的操作

常用的action分类

  • output statements:print,printf
  • Expressions:算术,比较表达式等
  • Compound statements:组合语句
  • Control statements:if, while等
  • input statements

awk控制语句

  • { statements;… } 组合语句
  • if(condition) {statements;…}
  • if(condition) {statements;…} else {statements;…}
  • while(conditon) {statments;…}
  • do {statements;…} while(condition)
  • for(expr1;expr2;expr3) {statements;…}
  • break
  • continue
  • exit

2.动作 print

格式:

print item1, item2, ...

说明:

  • 逗号分隔符
  • 输出item可以字符串,也可是数值;当前记录的字段、变量或awk的表达式
  • 如省略item,相当于print $0

范例:

[root@centos8 ~]#awk '{print "hello,awk"}'
[root@centos8 ~]#awk -F: '{print "wang"}' /etc/passwd
[root@centos8 ~]#awk -F: '{print}' /etc/passwd
[root@centos8 ~]#awk -F: '{print $0}' /etc/passwd
[root@centos8 ~]#awk -F: '{print $1,$3}' /etc/passwd
[root@centos8 ~]#awk -F: '{print $1"	"$3}' /etc/passwd
[root@centos8 ~]#grep "^UUID" /etc/fstab |awk {'print $2,$3'}
/ xfs
/boot ext4
/data xfs
swap swap
[root@centos8 ~]#awk '{print $1}' access_log |sort |uniq -c|sort -nr|head 
   4870 172.20.116.228
   3429 172.20.116.208
   2834 172.20.0.222
   2613 172.20.112.14
   2267 172.20.0.227
   2262 172.20.116.179
   2259 172.20.65.65
   1565 172.20.0.76
   1482 172.20.0.200
   1110 172.20.28.145
[root@centos8 ~]#df | awk -F"[[:space:]]+|%" '{print $5}'
Use
0
0
1
0
5
1
92
1
[root@centos8 ~]#df | grep "^/dev/sd" | awk -F"[[:space:]]+|%" '{print $5}'
5
1
92
[root@centos8 ~]#df | awk -F"[[:space:]]+|%" '/^/dev/sd/{print $5}'
5
1
92

3. awk变量

awk中的变量分为:内置和自定义变量

常见的内置变量

FS:输入字段分隔符,默认为空白字符,功能相当于 -F

范例:

awk -v FS=':' '{print $1,FS,$3}' /etc/passwd
awk -v FS=":" '{print $1FS$3}' /etc/passwd
awk –F:   '{print $1,$3,$7}'   /etc/passwd 
S=:;awk -v FS=$S '{print $1FS$3}' /etc/passwd

OFS:输出字段分隔符,默认为空白字符

范例:

awk -v FS=':' -v OFS=':' '{print $1,$3,$7}'   /etc/passwdRS:输入记录分隔符,指定输入时的换行符

RS:输入记录分隔符,指定输入时的换行符

范例:

awk -v RS=' ' ‘{print }’ /etc/passwd

ORS:输出记录分隔符,输出时用指定符号代替换行符

范例:

awk -v RS=' ' -v ORS='###' '{print $0}' /etc/passwd

NF:字段数量

范例:

#引用变量时,变量前不需加$
[root@centos8 ~]#awk -F:'{print NF}' /etc/fstab 
[root@centos8 ~]#awk -F:'{print $(NF-1)}' /etc/passwd
[root@centos8 ~]#ls /misc/cd/BaseOS/Packages/*.rpm |awk -F"." '{print $(NF-
1)}'|sort |uniq -c
   389 i686
   208 noarch
   1060 x86_64
[root@centos8 ~]#ss -nt |grep "^ESTAB" | awk -F"[[:space:]]+|:" '{print $(NF-
2)}'
10.0.0.1
10.0.0.7
10.0.0.1
[root@centos8 ~]#ss -nt |awk -F"[[:space:]]+|:" '/^ESTAB/{print $(NF-2)}'

范例: 将连接数超过3个以上的IP放入黑名单拒绝访问

cat deny_dos.sh
while true;do
ss -nt |grep "^ESTAB" | awk -F"[[:space:]]+|:" '{print $(NF-2)}'|sort |uniq - c|while read
count ip;do
#ss -nt | awk -F"[[:space:]]+|:" '/^ESTAB/{print $(NF-2)}'|sort |uniq -c
 if [ $count -gt 3 ];then
   iptables -A INPUT -s $ip -j REJECT
 fi
done
sleep 10
done

NR:记录编号

范例:

[root@centos8 ~]#awk -F: '{print NR}' /etc/passwd
1
2
3
.......
[root@centos8 ~]#awk -F: 'END{print NR}' /etc/passwd
57
[root@centos8 ~]#awk -F: 'BEGIN{print NR}' /etc/passwd
0

FNR:各文件分别计数,记录号

范例:

awk '{print FNR}' /etc/fstab /etc/inittab
[root@centos8 ~]#awk '{print NR,$0}' /etc/issue /etc/redhat-release 
1 S
2 Kernel r on an m
3
4 CentOS Linux release 8.0.1905 (Core) 
[root@centos8 script40]#awk '{print FNR,$0}' /etc/issue /etc/redhat-release 
1 S
2 Kernel r on an m
3
1 CentOS Linux release 8.0.1905 (Core)

FILENAME:当前文件名

范例:

[root@centos8 ~]#awk '{print FILENAME}' /etc/fstab
 
[root@centos8 ~]#awk '{print FNR,FILENAME,$0}' /etc/issue /etc/redhat-release 
1 /etc/issue S
2 /etc/issue Kernel r on an m
3 /etc/issue 
1 /etc/redhat-release CentOS Linux release 8.0.1905 (Core)

ARGC:命令行参数的个数

范例:

[root@centos8 ~]#awk '{print ARGC}' /etc/issue /etc/redhat-release 
3
3
3
3
[root@centos8 ~]#awk 'BEGIN{print ARGC}' /etc/issue /etc/redhat-release 
3

ARGV:数组,保存的是命令行所给定的各参数

范例:

[root@centos8 ~]#awk 'BEGIN{print ARGV[0]}' /etc/issue /etc/redhat-release 
awk
[root@centos8 ~]#awk 'BEGIN{print ARGV[1]}' /etc/issue /etc/redhat-release 
/etc/issue
[root@centos8 ~]#awk 'BEGIN{print ARGV[2]}' /etc/issue /etc/redhat-release 
/etc/redhat-release
[root@centos8 ~]#awk 'BEGIN{print ARGV[3]}' /etc/issue /etc/redhat-release 
[root@centos8 ~]#

自定义变量(区分字符大小写)

  • -v var=value
  • 在program中直接定义

范例:

awk  -v test='hello gawk' '{print test}' /etc/fstab 
awk  -v test='hello gawk' 'BEGIN{print test}'
awk  'BEGIN{test="hello,gawk";print test}'
awk  -F: '{sex=“male”;print $1,sex,age;age=18}' /etc/passwd

cat awkscript
{print script,$1,$2}
awk  -F: -f awkscript script="awk" /etc/passwd

动作 printf

printf 可以实现格式化输出

格式:

printf “FORMAT”, item1, item2, ...

说明:

  • 必须指定FORMAT
  • 不会自动换行,需要显式给出换行控制符,
  • FORMAT中需要分别为后面每个item指定格式符

格式符:与item一一对应

  • %c:显示字符的ASCII码
  • %d, %i:显示十进制整数
  • %e, %E:显示科学计数法数值
  • %f:显示为浮点数
  • %g, %G:以科学计数法或浮点形式显示数值
  • %s:显示字符串
  • %u:无符号整数
  • %%:显示%自身

修饰符

#[.#] 第一个数字控制显示的宽度;第二个#表示小数点后精度,如:%3.1f
- 左对齐(默认右对齐) 如:%-15s
+   显示数值的正负符号   如:%+d

范例:

awk -F:   '{printf "%s",$1}' /etc/passwd
awk -F:   '{printf "%s
",$1}' /etc/passwd
awk -F:   '{printf "%-20s %10d
",$1,$3}' /etc/passwd
awk -F:   '{printf "Username: %s
",$1}' /etc/passwd
awk -F:   '{printf “Username: %sUID:%d
",$1,$3}' /etc/passwd
awk -F:   '{printf "Username: %25sUID:%d
",$1,$3}' /etc/passwd
awk -F:   '{printf "Username: %-25sUID:%d
",$1,$3}' /etc/passwd

4 .操作符

算术操作符:

x+y, x-y, x*y, x/y, x^y, x%y
-x:转换为负数
+x:将字符串转换为数值

字符串操作符:没有符号的操作符,字符串连接

赋值操作符:

=, +=, -=, *=, /=, %=, ^=,++, --

范例:

[root@centos8 ~]#awk 'BEGIN{i=0;print ++i,i}'
1 1
[root@centos8 ~]#awk 'BEGIN{i=0;print i++,i}'
0 1

比较操作符:

==, !=, >, >=, <, <=

模式匹配符:

~ 左边是否和右边匹配,包含关系
!~ 是否不匹配

范例:

[root@centos8 ~]#awk -F: '$0 ~ /root/{print $1}' /etc/passwd
[root@centos8 ~]#awk -F: '$0 ~ "^root"{print $1}' /etc/passwd
[root@centos8 ~]#awk '$0 !~ /root/'   /etc/passwd
[root@centos8 ~]#awk '/root/'   /etc/passwd
[root@centos8 ~]#awk -F: '$3==0'     /etc/passwd
[root@centos8 ~]#df | awk -F"[[:space:]]+|%" '$0 ~ /^/dev/sd/{print $5}'
5
1
92
[root@centos8 ~]#ifconfig eth0 | awk 'NR==2{print $2}'
10.0.0.8

逻辑操作符:

与&&,或||,非!

范例:

awk -F:   '$3>=0 && $3<=1000 {print $1}' /etc/passwd
awk -F:   '$3==0 || $3>=1000 {print $1}' /etc/passwd 
awk -F:   '!($3==0) {print $1}'     /etc/passwd
awk -F:   '!($3>=500) {print $3}' /etc/passwd

条件表达式(三目表达式)

selector?if-true-expression:if-false-expression

范例:

awk -F: '{$3>=1000?usertype="Common User":usertype="SysUser";printf 
"%-20s:%12s
",$1,usertype}'   /etc/passwd

5.模式PATTERN

PATTERN:根据pattern条件,过滤匹配的行,再做处理

1. 如果未指定:空模式,匹配每一行

范例:

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

2. /regular expression/:仅处理能够模式匹配到的行,需要用/ /括起来

范例:

[root@centos8 ~]#awk   '/^UUID/{print $1}'     /etc/fstab
[root@centos8 ~]#awk   '!/^UUID/{print $1}'   /etc/fstab
[root@centos8 ~]#df | awk '/^/dev/sd/'
/dev/sda2      104806400 4935924  99870476   5% /
/dev/sda3       52403200  398876  52004324   1% /data
/dev/sda1         999320  848572     81936  92% /boot

3. relational expression: 关系表达式,结果为“真”才会被处理

真:结果为非0值,非空字符串

假:结果为空字符串或0值

范例:

awk -F: 'i=1;j=1{print i,j}' /etc/passwd
awk '!0' /etc/passwd ;awk '!1' /etc/passwd
Awk -F: '$3>=1000{print $1,$3}' /etc/passwd
awk -F: '$3<1000{print $1,$3}' /etc/passwd
awk -F: '$NF=="/bin/bash"{print $1,$NF}' /etc/passwd
awk -F: '$NF ~ /bash$/{print $1,$NF}' /etc/passwd

4. line ranges:行范围

/pat1/,/pat2/ 不支持直接给出数字格式

范例:

[root@centos8 ~]#awk '/^bin/,/^adm/' /etc/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
[root@centos8 ~]#sed -n '/^bin/,/^adm/p' /etc/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
[root@centos8 ~]#awk 'NR>=3 && NR<=6{print NR,$0}' /etc/passwd
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
6 sync:x:5:0:sync:/sbin:/bin/sync
[root@centos8 ~]#sed -n '3,6p' /etc/passwd
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync

5. BEGIN/END模式

BEGIN{}:仅在开始处理文件中的文本之前执行一次

END{}:仅在文本处理完成之后执行一次

范例

awk -F : 'BEGIN {print "USER USERID"} {print $1":"$3} END{print "END FILE"}' 
/etc/passwd
awk -F: '{print "USER USERID";print $1":"$3} END{print "END FILE"}' /etc/passwd
awk -F: 'BEGIN{print "USER UID 
--------------- "}{print $1,$3}' /etc/passwd
awk -F: 'BEGIN{print "USER UID 
------"}{print $1,$3}'END{print "========"} 
/etc/passwd
seq 10 | awk   'i=0'
seq 10 | awk   'i=1'
seq 10 | awk   'i=!i'
seq 10 | awk   '{i=!i;print i}'
seq 10 | awk   '!(i=!i)'              
seq 10 | awk -v i=1 'i=!i'

6.条件判断 if-else

语法:

if(condition){statement;…}[else statement]
if(condition1){statement1}else if(condition2){statement2}else{statement3}

使用场景:对awk取得的整行或某个字段做条件判断

范例:

awk -F: '{if($3>=1000)print $1,$3}' /etc/passwd
awk -F: '{if($NF=="/bin/bash") print $1}' /etc/passwd
awk '{if(NF>5) print $0}' /etc/fstab
awk -F: '{if($3>=1000) {printf "Common user: %s
",$1} else {printf "root or 
Sysuser: %s
",$1}}' /etc/passwd
awk -F: '{if($3>=1000) printf "Common user: %s
",$1; else printf "root or 
Sysuser: %s
",$1}' /etc/passwd
df -h|awk -F% '/^/dev/sd/{print $1}'| awk '$NF>=80{print $1,$5}'
df | awk -F"[[:space:]]+|%" '/^/dev/sd/{if($5>80)print $1,$5}'
awk 'BEGIN{ test=100;if(test>90){print "very good"}
 else if(test>60){ print "good"}else{print "no pass"}}'

7.switch语句

语法:

switch(expression) {case VALUE1 or /REGEXP/: statement1; case VALUE2 or 
/REGEXP2/: statement2; ...; default: statementn}

8.循环while

语法:

while (condition) {statement;…}

条件“真”,进入循环;条件“假”,退出循环

使用场景:

对一行内的多个字段逐一类似处理时使用

对数组中的各元素逐一处理时使用

示例:

[root@centos8 ~]#awk 'BEGIN{print length("hello")}'
5
[root@centos8 ~]#awk 'BEGIN{print length("马哥教育")}'
4
[root@centos7 ~]#awk '/^[[:space:]]*linux16/{i=1;while(i<=NF){print 
$i,length($i); i++}}' /etc/grub2.cfg
linux16 7
/vmlinuz-3.10.0-1062.el7.x86_64 31
root=UUID=bebb9244-bbb8-4c69-9249-54a36c75155e 46
ro 2
crashkernel=auto 16
rhgb 4
quiet 5
net.ifnames=0 13
linux16 7
/vmlinuz-0-rescue-b12558570741487c9328c996e3265b09 50
root=UUID=bebb9244-bbb8-4c69-9249-54a36c75155e 46
ro 2
crashkernel=auto 16
rhgb 4
quiet 5
net.ifnames=0 13
[root@centos7 ~]#awk '/^[[:space:]]*linux16/{i=1;while(i<=NF) 
{if(length($i)>=10){print $i,length($i)}; i++}}' /etc/grub2.cfg
/vmlinuz-3.10.0-1062.el7.x86_64 31
root=UUID=bebb9244-bbb8-4c69-9249-54a36c75155e 46
crashkernel=auto 16
net.ifnames=0 13
/vmlinuz-0-rescue-b12558570741487c9328c996e3265b09 50
root=UUID=bebb9244-bbb8-4c69-9249-54a36c75155e 46
crashkernel=auto 16
net.ifnames=0 13
[root@centos8 ~]#awk 'BEGIN{ total=0;i=1;while(i<=100){total+=i;i++};print 
total}'
5050

9.循环 do-while

语法:

do {statement;…}while(condition)

意义:无论真假,至少执行一次循环体

do-while循环

语法:do {statement;…}while(condition)

意义:无论真假,至少执行一次循环体

范例:

[root@centos8 ~]#awk 'BEGIN{ total=0;i=1;do{ total+=i;i++;}while(i<=100);print
total}'
5050

10. 循环for

语法:

for(expr1;expr2;expr3) {statement;…}

常见用法:

for(variable assignment;condition;iteration process) {for-body}

特殊用法:能够遍历数组中的元素

for(var in array) {for-body}

范例:

[root@centos8 ~]#awk 'BEGIN{total=0;for(i=1;i<=100;i++){total+=i};print total}'
5050

范例:

[root@centos7 ~]#awk '/^[[:space:]]*linux16/{for(i=1;i<=NF;i++) {print 
$i,length($i)}}' /etc/grub2.cfg
linux16 7
/vmlinuz-3.10.0-1062.el7.x86_64 31
root=UUID=bebb9244-bbb8-4c69-9249-54a36c75155e 46
ro 2
crashkernel=auto 16
rhgb 4
quiet 5
net.ifnames=0 13
linux16 7
/vmlinuz-0-rescue-b12558570741487c9328c996e3265b09 50
root=UUID=bebb9244-bbb8-4c69-9249-54a36c75155e 46
ro 2
crashkernel=auto 16
rhgb 4
quiet 5
net.ifnames=0 13

性能比较

time (awk 'BEGIN{ total=0;for(i=0;i<=10000;i++){total+=i;};print total;}')
time (total=0;for i in {1..10000};do total=$(($total+i));done;echo $total)
time (for ((i=0;i<=10000;i++));do let total+=i;done;echo $total)
time (seq –s ”+” 10000|bc)

11. continue和break

格式:

continue [n]
break [n]

范例:

[root@centos8 ~]#awk 'BEGIN{sum=0;for(i=1;i<=100;i++)
{if(i%2==0)continue;sum+=i}print sum}'
2500
[root@centos8 ~]#awk 'BEGIN{sum=0;for(i=1;i<=100;i++)
{if(i==50)break;sum+=i}print sum}'
1225

12 .next

next 可以提前结束对本行处理而直接进入下一行处理(awk自身循环)

范例:

[root@centos8 ~]#awk -F: '{if($3%2!=0) next; print $1,$3}' /etc/passwd
root 0
daemon 2
lp 4
shutdown 6
mail 8
games 12
ftp 14
nobody 65534
polkitd 998
gluster 996
rtkit 172
rpc 32
chrony 994
saslauth 992
clevis 984
pegasus 66
colord 982
setroubleshoot 980
gdm 42
gnome-initial-setup 978
sshd 74
avahi 70
tcpdump 72
wang 1000

13.数组

awk的数组为关联数组

格式

array[index-expression]

范例:

weekdays["mon"]="Monday"

index-expression

  • 可使用任意字符串;字符串要使用双引号括起来
  • 如果某数组元素事先不存在,在引用时,awk会自动创建此元素,并将其值初始化为“空串”
  • 若要判断数组中是否存在某元素,要使用“index in array”格式进行遍历

范例:

[root@centos8 ~]#awk 
'BEGIN{weekdays["mon"]="Monday";weekdays["tue"]="Tuesday";print 
weekdays["mon"]}'
Monday

范例:

awk '!line[$0]++' dupfile
awk '{!line[$0]++;print $0, line[$0]}' dupfile

范例:判断数组索引是否存在

[root@centos8 ~]# awk 'BEGIN{array["i"]="x"; array["j"]="y" ; print "i" in
array, "y" in array }'
1 0
[root@centos8 ~]#awk 'BEGIN{array["i"]="x"; array["j"]="y" ;if ("i" in array )
{print "存在"}else{print "不存在"}}'
存在
[root@centos8 ~]#awk 'BEGIN{array["i"]="x"; array["j"]="y" ;if ("abc" in array )
{print "存在"}else{print "不存在"}}'
不存在

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

for(var in array) {for-body}

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

范例:遍历数组

[root@centos8 ~]#awk 
'BEGIN{weekdays["mon"]="Monday";weekdays["tue"]="Tuesday";for(i in weekdays) 
{print weekdays[i]}}'
Tuesday
Monday
[root@centos8 ~]#awk 'BEGIN {
a["x"] = "welcome"
a["y"] = "to"
a["z"] = "Magedu"
for (i in a) {
     print i,a[i]
}}'
x welcome
y to
z Magedu
[root@centos8 ~]#awk -F: '{user[$1]=$3}END{for(i in user){print "username: 
"i,"uid: "user[i]}}' /etc/passwd
username: adm uid: 3
username: rpc uid: 32
username: dnsmasq uid: 985
username: radvd uid: 75
username: sync uid: 5
username: mail uid: 8
username: exim uid: 93
username: tss uid: 59
username: gluster uid: 996
username: unbound uid: 995
username: halt uid: 7

范例:

[root@centos8 ~]#cat ss.log | sed -nr '1!s/^([^0-9]+) .*/1/p'|sort |uniq -c
    529 ESTAB    
      9 LISTEN   
    128 SYN-RECV 
     95 TIME-WAIT
[root@centos8 ~]#ss -ant | awk 'NR!=1{state[$1]++}END{for(i in state){print 
i,state[i]}}'
SYN-RECV 128
LISTEN 9
ESTAB 529
TIME-WAIT 95
[root@centos8 ~]#netstat -tan | awk '/^tcp/{state[$NF]++}END{for(i in state)
{print i,state[i]}}'
LISTEN 9
SYN_RECV 126
ESTABLISHED 523
FIN_WAIT2 40
[root@centos8 ~]#awk '{ip[$1]++}END{for(i in ip){print i,ip[i]}}' 
/var/log/httpd/access_log
172.20.0.200 1482
172.20.21.121 2
172.20.30.91 29
172.16.102.29 864
172.20.0.76 1565
172.20.9.9 15
172.20.1.125 463
172.20.61.11 2
172.20.73.73 198
[root@centos8 ~]#awk '{ip[$1]++}END{for(i in ip){print ip[i],i}}' access_log 
|sort -nr| head -3
4870 172.20.116.228
3429 172.20.116.208
2834 172.20.0.222
[root@centos8 ~]#awk '{ip[$1]++}END{for(i in ip){print i,ip[i]}}' access_log 
|sort -k2 -nr|head -3
172.20.116.228 4870
172.20.116.208 3429
172.20.0.222 2834

范例:多维数组

[root@centos8 ~]#awk 'BEGIN{
> array[1][1]=11
> array[1][2]=12
> array[1][3]=13
> array[2][1]=21
> array[2][2]=22
> array[2][3]=23
> for (i in array)
>     for (j in array[i])
>         print array[i][j]
> }'
11
12
13
21
22
23

14 awk函数

awk 的函数分为内置和自定义函数

常见内置函数

数值处理:

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

srand():配合rand() 函数,生成随机数的种子

int():返回整数

范例:

[root@centos8 ~]#awk 'BEGIN{srand();print rand()}'
0.790437
[root@centos8 ~]#awk 'BEGIN{srand();print rand()}'
0.283736
[root@centos8 ~]#awk 'BEGIN{srand();print rand()}'
0.948082
[root@centos8 ~]#awk 'BEGIN{srand();print rand()}'
0.371798
[root@centos8 ~]#awk 'BEGIN{srand(); for (i=1;i<=10;i++)print int(rand()*100) 
}' 
35
17
35
95
19
15
70
54
46
93

字符串处理:

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

sub(r,s,[t]):对t字符串搜索r表示模式匹配的内容,并将第一个匹配内容替换为s

范例:

[root@centos8 ~]#echo "2008:08:08 08:08:08" | awk 'sub(/:/,"-",$1)'
2008-08:08 08:08:08
[root@centos8 ~]#echo "2008:08:08 08:08:08" | awk '{sub(/:/,"-",$1);print $0}'
2008-08:08 08:08:08

gsub(r,s,[t]):对t字符串进行搜索r表示的模式匹配的内容,并全部替换为s所表示的内容

范例:

[root@centos8 ~]#echo "2008:08:08 08:08:08" | awk 'gsub(/:/,"-",$0)'
2008-08-08 08-08-08
[root@centos8 ~]#echo "2008:08:08 08:08:08" | awk '{gsub(/:/,"-",$0);print $0}'
2008-08-08 08-08-08

split(s,array,[r]):以r为分隔符,切割字符串s,并将切割后的结果保存至array所表示的数组中,第一个索引值为1,第二个索引值为2,…

范例:

[root@centos8 ~]#netstat -tn | awk 
'/^tcp/{split($5,ip,":");count[ip[1]]++}END{for(i in count){print i,count[i]}}'
10.0.0.1 1
10.0.0.6 1
10.0.0.7 673

system 函数:可以awk中调用shell命令

空格是awk中的字符串连接符,如果system中需要使用awk中的变量可以使用空格分隔,或者说除了

awk的变量外其他一律用""引用起来

awk 'BEGIN{system("hostname")}'
awk 'BEGIN{score=100; system("echo your score is " score) }'
[root@centos8 ~]#netstat -tn | awk 
'/^tcp/{split($5,ip,":");count[ip[1]]++}END{for(i in count){if(count[i]>=10)
{system("iptables -A INPUT -s "i" -j REJECT")}}}'

自定义函数

自定义函数格式:

function name ( parameter, parameter, ... ) {
   statements
   return expression
}

范例:

[root@centos8 ~]#cat func.awk
function max(x,y) {
 x>y?var=x:var=y
 return var
}
BEGIN{print max(a,b)}
[root@centos8 ~]#awk -v a=30 -v b=20 -f func.awk
30

15. awk脚本

将awk程序写成脚本,直接调用或执行

范例:

[root@centos8 ~]#cat passwd.awk 
{if($3>=1000)print $1,$3}
[root@centos8 ~]#awk -F: -f passwd.awk /etc/passwd
nobody 65534
wang 1000
mage 1001

范例:

[root@centos8 ~]#cat test.awk
#!/bin/awk -f
#this is a awk script
{if($3>=1000)print $1,$3}
[root@centos8 ~]#chmod +x test.awk
[root@centos8 ~]#./test.awk -F: /etc/passwd
nobody 65534
wang 1000
mage 1001

向awk脚本传递参数

格式:

awkfile var=value var2=value2... Inputfile

注意:在BEGIN过程中不可用。直到首行输入完成以后,变量才可用。可以通过-v 参数,让awk在执行BEGIN之前得到变量的值。命令行中每一个指定的变量都需要一个-v参数

范例:

[root@centos8 ~]#cat test2.awk 
#!/bin/awk -f
{if($3 >=min && $3<=max)print $1,$3} 
[root@centos8 ~]#chmod +x test2.awk
[root@centos8 ~]#./test2.awk -F: min=100 max=200 /etc/passwd
systemd-resolve 193
rtkit 172
pulse 171
qemu 107
usbmuxd 113
abrt 173

【有需要pdf版资料的,可见下图领取方式】

linux下文本处理三剑客学习汇总:grep、sed、awk

页面更新:2024-05-16

标签:行号   递归   文本   随机数   表达式   范例   变量   脚本   单词   函数   开头   条件   参数   模式   目录   科技

1 2 3 4 5

上滑加载更多 ↓
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top