当前位置: 澳门新濠3559 > 操作系统 > 正文

sed通过限制条件对文本进行行读取,  -e匹配多

时间:2019-12-26 00:20来源:操作系统
[root@VM_0_7_centos tmp]# cat 1.txt 123456[root@VM_0_7_centos tmp]# cat 2.txt 45678[root@VM_0_7_centos tmp]# grep -f 1.txt 2.txt 456[root@VM_0_7_centos tmp]# grep -f -v 1.txt 2.txt grep: -v: No such file or directory[root@VM_0_7_centos tmp]
[root@VM_0_7_centos tmp]# cat 1.txt 
1
2
3
4
5
6
[root@VM_0_7_centos tmp]# cat 2.txt 
4
5
6
7
8

[root@VM_0_7_centos tmp]# grep -f 1.txt 2.txt 
4
5
6
[root@VM_0_7_centos tmp]# grep -f -v 1.txt 2.txt 
grep: -v: No such file or directory
[root@VM_0_7_centos tmp]# grep -v -f 1.txt 2.txt 
7
8

grep

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

grep [OPTIONS] PATTERN [FILE…]

  • –color=auto: 对匹配到的文本着色显示 
  • -v: 显示不被pattern匹配到的行
  • -i: 忽略字符大小写
  • -n: 显示匹配的行号
  • -c: 统计匹配的行数
  • -o: 仅显示匹配到的字符串
  • -q: 静默模式,不输出任何信息 
  • -A #: after, 显示匹配到的行和后#行
  • -B #: before, 显示匹配到的行和前#行
  • -C #:context, 显示匹配到的行和前后各#行
  • -e: 实现多个选项间的逻辑or关系。grep –e ‘cat ’ -e ‘dog’ file 
  • -w: 整行匹配整个单词
  • -E: 使用扩展正则表达式
  • -F: 相当于fgrep,不支持正则表达式

今天主要介绍Linux中两大文本编辑器的入门级用法:sed(stream editor)和awk

  -e匹配多个模式,-v反转输出,-f匹配多个文件中相同的行

sed

sed是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”( pattern space),接着用sed命令处理缓冲区中的内容 ,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变 ,除非你使用重定向存储输出。Sed主要用来自动编辑一 个或多个文件,简化对文件的反复操作,编写转换程序等

sed [option]… script inputfile…

  • -n: 不输出模式空间内容到屏幕,即不自动打印
  • -e: 多点编辑
  • -f: /PATH/SCRIPT_FILE: 从指定文件中读取编辑脚本 
  • -r: 支持使用扩展正则表达式
  • -i: 原处编辑
  • -i.bak: 原处编辑,编辑前复制源文件为源文件名称+.bak后缀

先说说sed,sed即stream editor。是一种非交互式上下文编辑器,它对源文件没有破坏性,查询中不改动源文件(但可以实现此功能),sed通过限制条件对文本进行行读取,并将读取内容贮存在内存中,根据限制内容pattern将文本由选择性的输出。sed不仅仅能够根据pattern(样式)作为约束条件,它还支持脚本导入的约束条件,这样节省了可观的键入和随之而来的错误。

[root@VM_0_7_centos tmp]# echo "11 22 33 44 55" |xargs -n1 | grep -e "11"
11
[root@VM_0_7_centos tmp]# echo "11 22 33 44 55" |xargs -n1 | grep -e "11" -e "22"
11
22

script=地址定界+编辑命令

下面我们来看看sed的简单用法:

  -i忽略大小写

地址定界
  • 不给地址:对全文进行处理 
  • 单地址:
    • #: 指定的行
    • /pattern/:被此处模式所能够匹配到的每一行 
  • 地址范围:
    • #,#: 
    • #,+# 
    • /pat1/,/pat2/ 
    • #,/pat1/
  • ~:步进
    • 1~2: 从1开始,步进2,表示奇数行
    • 2~2 从2开始,步进2,表示偶数行

sed [option] /pattern/command file…

[root@VM_0_7_centos tmp]# echo "AA aa bb " | xargs -n1 | egrep -i "aa"
AA
aa

编辑命令

  • d: 删除模式空间匹配的行
  • p: 显示模式空间中的内容
  • a []text: 在指定行后面追加文本支持使用n实现多行追加
  • i []text: 在行前面插入文本
  • c []text: 替换行为单行或多行文本
  • w /path/somefile: 保存模式匹配的行至指定文件
  • r /path/somefile: 读取指定文件的文本至模式空间中
  • 匹配到的行后 =: 为模式空间中的行打印行号
  • !: 模式空间中匹配行取反处理

sed [option] adr1,adr2/command file…

  -o只输出匹配内容

查找替换

  • s///:查找替换,支持使用其它分隔符,s@@@,s### 
  • 替换标记:
    • g: 行内全局替换
    • p: 显示替换成功的行
    • w /PATH/TO/SOMEFILE:将替换成功的行保存至文件中

sed [option] script file..

[root@VM_0_7_centos tmp]# ifconfig 
eth0      Link encap:Ethernet  HWaddr 52:54:00:BE:3B:97  
          inet addr:172.17.0.7  Bcast:172.17.15.255  Mask:255.255.240.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:9272287 errors:0 dropped:0 overruns:0 frame:0
          TX packets:9005522 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:1614323123 (1.5 GiB)  TX bytes:2170651985 (2.0 GiB)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:194402 errors:0 dropped:0 overruns:0 frame:0
          TX packets:194402 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:213430544 (203.5 MiB)  TX bytes:213430544 (203.5 MiB)

[root@VM_0_7_centos tmp]# ifconfig | egrep "172.17.0.7"
          inet addr:172.17.0.7  Bcast:172.17.15.255  Mask:255.255.240.0
[root@VM_0_7_centos tmp]# ifconfig | egrep -o "172.17.0.7"
172.17.0.7

高级编辑命令

  • h: 把模式空间中的内容覆盖至保持空间中
  • H:把模式空间中的内容追加至保持空间中
  • g: 从保持空间取出数据覆盖至模式空间 
  • G:从保持空间取出内容追加至模式空间
  • x: 把模式空间中的内容与保持空间中的内容进行互换 
  • n: 读取下一行到模式空间,且后期的操作命令只对该行有效 
  • N: 读取下一行到模式空间,且后期的操作命令对模式空间的所有行有效 
  • d: 删除模式空间中的行
  • D:删除当前模式空间开端至n的内容(不再传至标准输 出),放弃之后的命令,但是对剩余模式空间重新执行sed

command:命令不支持像选项那样可以组合使用,所以每条命令在每个语句中只能出现一次。

sed

流编辑器,过滤和替换文本。

工作原理:sed命令将当前处理的行读入模式空间进行处理,处理完把结果输出,并清空模式空间。然后再将下一行读入模式空间进行处理输出,以此类推,直至最后一行。

用法:sed [OPTION]... {script-only-if-no-other-script} [input-file]...

sed [选项] '地址 命令' file

选项 描述
-n 不打印模式空间
-e 执行脚本-表达式来处理
-f 脚本文件的内容添加到命令被执行
-i 修改源文件
-r 使用扩展正则表达式
命令 m描述
s/regexp/replacement/ t替换字符串
p d打印当前模式空间
P d打印模式空间的第一行
d s删除模式空间,并且开始下一个循环
D s删除模式空间的第一行,开始下一个循环
= d打印当前行号
a text d当前行追加文本
i text d当前行上面插入文本
c text s所选行替换文本
q l立即退出sed脚本
r z追加文本来自文件
地址 m描述
first~step b步长,每step行,从first开始
$ p匹配最后一行
/regexp/ z正则表达式匹配行
number z只匹配制定行
addr1、addr2 k开始匹配addr1开始,直接addr2行结束
addr1,+N c从addr1行开始,向后的N行
addr1,~N c从addr1行开始,到N行结束
[root@VM_0_7_centos tmp]# tail /etc/services 
nimgtw          48003/udp               # Nimbus Gateway
3gpp-cbsp       48049/tcp               # 3GPP Cell Broadcast Service Protocol
isnetserv       48128/tcp               # Image Systems Network Services
isnetserv       48128/udp               # Image Systems Network Services
blp5            48129/tcp               # Bloomberg locator
blp5            48129/udp               # Bloomberg locator
com-bardac-dw   48556/tcp               # com-bardac-dw
com-bardac-dw   48556/udp               # com-bardac-dw
iqobject        48619/tcp               # iqobject
iqobject        48619/udp               # iqobject

[root@VM_0_7_centos tmp]# tail /etc/services | sed -n "/blp5/p"  匹配第一行
blp5            48129/tcp               # Bloomberg locator
blp5            48129/udp               # Bloomberg locator

[root@VM_0_7_centos tmp]# tail /etc/services | sed -n "1p"   匹配第二行
nimgtw          48003/udp               # Nimbus Gateway
[root@VM_0_7_centos tmp]# tail /etc/services | sed -n "2p"
3gpp-cbsp       48049/tcp               # 3GPP Cell Broadcast Service Protocol

[root@VM_0_7_centos tmp]# tail /etc/services | sed -n "1,3p"  匹配1-3行
nimgtw          48003/udp               # Nimbus Gateway
3gpp-cbsp       48049/tcp               # 3GPP Cell Broadcast Service Protocol
isnetserv       48128/tcp               # Image Systems Network Services

[root@VM_0_7_centos tmp]# seq 10 | sed -n "1~2p"  从1开始,每次跳过一行
1
3
5
7
9

[root@VM_0_7_centos tmp]# tail /etc/services | sed -n "$p"
[root@VM_0_7_centos tmp]# tail /etc/services | sed -n '$p'  打印最后一行
iqobject        48619/udp               # iqobject

[root@VM_0_7_centos tmp]# tail /etc/services | sed -n '$!p'  不打印最后一行
nimgtw          48003/udp               # Nimbus Gateway
3gpp-cbsp       48049/tcp               # 3GPP Cell Broadcast Service Protocol
isnetserv       48128/tcp               # Image Systems Network Services
isnetserv       48128/udp               # Image Systems Network Services
blp5            48129/tcp               # Bloomberg locator
blp5            48129/udp               # Bloomberg locator
com-bardac-dw   48556/tcp               # com-bardac-dw
com-bardac-dw   48556/udp               # com-bardac-dw
iqobject        48619/tcp               # iqobject

[root@VM_0_7_centos tmp]# tail /etc/services | sed -n '/^blp5/,/^com/p'  匹配从blp5到com开头(第一个)的
blp5            48129/tcp               # Bloomberg locator
blp5            48129/udp               # Bloomberg locator
com-bardac-dw   48556/tcp               # com-bardac-dw

[root@VM_0_7_centos tmp]# tail services | sed '/blp5/d'  删除blp5行,不需要加-n
nimgtw          48003/udp               # Nimbus Gateway
3gpp-cbsp       48049/tcp               # 3GPP Cell Broadcast Service Protocol
isnetserv       48128/tcp               # Image Systems Network Services
isnetserv       48128/udp               # Image Systems Network Services
com-bardac-dw   48556/tcp               # com-bardac-dw
com-bardac-dw   48556/udp               # com-bardac-dw
iqobject        48619/tcp               # iqobject
iqobject        48619/udp               # iqobject

[root@VM_0_7_centos tmp]# tail services | sed 's/blp5/test/'  将blp5替换为test,(没有加全局就只修改第一个匹配到的字符串)
nimgtw          48003/udp               # Nimbus Gateway
3gpp-cbsp       48049/tcp               # 3GPP Cell Broadcast Service Protocol
isnetserv       48128/tcp               # Image Systems Network Services
isnetserv       48128/udp               # Image Systems Network Services
test            48129/tcp               # Bloomberg locator
test            48129/udp               # Bloomberg locator
com-bardac-dw   48556/tcp               # com-bardac-dw
com-bardac-dw   48556/udp               # com-bardac-dw
iqobject        48619/tcp               # iqobject
iqobject        48619/udp               # iqobject
[root@VM_0_7_centos tmp]# tail services | sed 's/blp5/test/g'  替换所有的blp5为test
nimgtw          48003/udp               # Nimbus Gateway
3gpp-cbsp       48049/tcp               # 3GPP Cell Broadcast Service Protocol
isnetserv       48128/tcp               # Image Systems Network Services
isnetserv       48128/udp               # Image Systems Network Services
test            48129/tcp               # Bloomberg locator
test            48129/udp               # Bloomberg locator
com-bardac-dw   48556/tcp               # com-bardac-dw
com-bardac-dw   48556/udp               # com-bardac-dw
iqobject        48619/tcp               # iqobject
iqobject        48619/udp               # iqobject

[root@VM_0_7_centos tmp]# tail services |sed '1,5s/blp5/test/g'  替换1-5行的blp5为test

nimgtw          48003/udp               # Nimbus Gateway
3gpp-cbsp       48049/tcp               # 3GPP Cell Broadcast Service Protocol
isnetserv       48128/tcp               # Image Systems Network Services
isnetserv       48128/udp               # Image Systems Network Services
test            48129/tcp               # Bloomberg locator
blp5            48129/udp               # Bloomberg locator
com-bardac-dw   48556/tcp               # com-bardac-dw
com-bardac-dw   48556/udp               # com-bardac-dw
iqobject        48619/tcp               # iqobject
iqobject        48619/udp               # iqobject

[root@VM_0_7_centos tmp]# tail services | sed 's/nimgtw/test/;s/udp/ll/'  对前面匹配到结果中的内容再进行匹配
test          48003/ll               # Nimbus Gateway
3gpp-cbsp       48049/tcp               # 3GPP Cell Broadcast Service Protocol
isnetserv       48128/tcp               # Image Systems Network Services
isnetserv       48128/ll               # Image Systems Network Services
blp5            48129/tcp               # Bloomberg locator
blp5            48129/ll               # Bloomberg locator
com-bardac-dw   48556/tcp               # com-bardac-dw
com-bardac-dw   48556/ll               # com-bardac-dw
iqobject        48619/tcp               # iqobject
iqobject        48619/ll               # iqobject

[root@VM_0_7_centos tmp]# tail services | sed -r 's/(.*) ([0-9]+.*)(#.*)/1/'
nimgtw         
3gpp-cbsp      
isnetserv      
isnetserv      
blp5           
blp5           
com-bardac-dw  
com-bardac-dw  
iqobject       
iqobject       
[root@VM_0_7_centos tmp]# tail services | sed -r 's/(.*) ([0-9]+.*)(#.*)/12/'
nimgtw         48003/udp               
3gpp-cbsp      48049/tcp               
isnetserv      48128/tcp               
isnetserv      48128/udp               
blp5           48129/tcp               
blp5           48129/udp               
com-bardac-dw  48556/tcp               
com-bardac-dw  48556/udp               
iqobject       48619/tcp               
iqobject       48619/udp               
[root@VM_0_7_centos tmp]# tail services | sed -r 's/(.*) ([0-9]+.*)(#.*)/123/'
nimgtw         48003/udp               # Nimbus Gateway
3gpp-cbsp      48049/tcp               # 3GPP Cell Broadcast Service Protocol
isnetserv      48128/tcp               # Image Systems Network Services
isnetserv      48128/udp               # Image Systems Network Services
blp5           48129/tcp               # Bloomberg locator
blp5           48129/udp               # Bloomberg locator
com-bardac-dw  48556/tcp               # com-bardac-dw
com-bardac-dw  48556/udp               # com-bardac-dw
iqobject       48619/tcp               # iqobject
iqobject       48619/udp               # iqobject

[root@VM_0_7_centos tmp]# seq 10 |sed '/5/,+3s/^/#/'  加注释
1
2
3
4
#5
#6
#7
#8
9
10

[root@VM_0_7_centos tmp]# seq 10 | sed '5s/.*/&ntest/'  &的作用是取前面所匹配到的结果
1
2
3
4
5
test
6
7
8
9
10
[root@VM_0_7_centos tmp]# seq 10 | sed '5s/.*/testn&/'
1
2
3
4
test
5
6
7
8
9
10


[root@VM_0_7_centos tmp]# seq 10 |sed 'n;n;s/^/ll/'
1
2
ll3
4
5
ll6
7
8
ll9
10

awk

AWK是由Aho, Weinberger, Kernighan这三个人共同开发出的一优良的文本处理工具,Linux及Unix环境中现有的功能最强大的数据处理引擎之一。

awk [options] ‘program’ var=value file…
awk [options] -f programfile var=value file…
awk [options] ‘BEGIN{ action;… } pattern{ action;… } END{ action;… }’ file …

  • options
    • -F 指明输入时用到的字段分隔符
    • -v var=value: 自定义变量
    • -f 指定awk程序文件
  • BEGIN{ action;… }: 读入文本之前执行{action;…}
  • END{ action;… }: 文本处理完之后执行{ action;… }
  • pattern{ action;… }: pattern的返回值为True时,才执行{action;…},pattern可以有以下几种:
    • 如果未指定pattern: 匹配每一行
    • /regular expression/: 仅处理能够被模式(正则表达式匹配到的行,需要用/ /括起来
    • relational expression: 关系表达式,
      */pat1/,/pat2/: 行范围startline,endline不支持直接给出数字格式
    • True: 结果为非0值,非空字符串
    • False: 结果为空字符串或0值

p:显示出所有信息,在设定显示条件的情况下匹配内容会多显示一次。

awk

awk是一个处理文本的编程语言工具,能用简短的程序处理输入文件、数据排序、计算以及生产报表等等。

在Linux系统下默认awk是gawk,它是awk的GUN版本。可以通过命令查看应用的版本:ll /bin/awk

图片 1

基本的命令语法:awk option 'patten {action}' file

其中pattern表示AWK在数据中查找的内容,而action是在找到匹配内容时所执行的一系列命令。花括号用于根据特定的模式对一系列指令进行分组。

pattern参数可以是egrep正则表达式的任意一个,使用/re/再加上一些样式匹配,匹配方式与sed类似,也可以使用“,”分开两样式以选个某个范围。

awk处理的工作方式与数据库类似,支持对记录和字段处理,这也是grep和sed不能实现的。

在awk中,缺省的情况下将文本文件中一行视为一个记录,而将一行中的某一部分作为记录中的一个字段,用1,2,3....数字的方式顺序的表示行(记录)中的不同字段。用$后跟数字,引用对应的字段,以逗号分割,0表示整个行。

选项 m描述
-f program-file c从文件中读取awk程序源文件
-F fs z指定fs为输入字段分隔符
-v var=value b变量赋值
--posix z只支持POSIX正则表达式

图片 2

Pattern Description
BEGIN{ } g给程序赋予初始状态,先执行的工作
END{ } c程序结束之后执行的一些扫尾工作
/regular expression/ w为每个输入记录匹配正则表达式
pattern && pattern l逻辑and,满足两个模式

pattern || pattern

逻辑或,满足其中一个模式
! pattern l逻辑非,不满足模式
pattern1,pattern2 f范围模式,匹配所以1的记录,直到匹配到模式2

 

[root@VM_0_7_centos tmp]# tail services 
nimgtw          48003/udp               # Nimbus Gateway
3gpp-cbsp       48049/tcp               # 3GPP Cell Broadcast Service Protocol
isnetserv       48128/tcp               # Image Systems Network Services
isnetserv       48128/udp               # Image Systems Network Services
blp5            48129/tcp               # Bloomberg locator
blp5            48129/udp               # Bloomberg locator
com-bardac-dw   48556/tcp               # com-bardac-dw
com-bardac-dw   48556/udp               # com-bardac-dw
iqobject        48619/tcp               # iqobject
iqobject        48619/udp               # iqobject
[root@VM_0_7_centos tmp]# tail services | awk -F '/' '{print $1}'  指定/为分割符,打印出第一部分
nimgtw          48003
3gpp-cbsp       48049
isnetserv       48128
isnetserv       48128
blp5            48129
blp5            48129
com-bardac-dw   48556
com-bardac-dw   48556
iqobject        48619
iqobject        48619

[root@VM_0_7_centos ~]# awk -va="123" 'BEGIN{print a}'
123
[root@VM_0_7_centos ~]# a=456
[root@VM_0_7_centos ~]# awk -va=$a 'BEGIN{print a}'
456

  图片 3

图片 4

 

[root@Gin scripts]# awk '{print $0}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
.....................................................

[root@Gin scripts]# echo hhh|awk '{print "hello,world"}'
hello,world

[root@Gin scripts]# awk '{print "hiya"}' /etc/passwd
hiya
hiya
hiya
hiya
...............................................

调用awk时,指定/etc/passwd作为输入文件,执行awk时,它依次对/etc/passwd中的每一行执行print命令。

所有输出都发送到stdout,所得到的结果与执行cat /etc/passwd完全相同。

图片 5

[root@VM_0_7_centos ~]# awk -F":" '{print $1}' /etc/passwd
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
uucp
operator
games
gopher
ftp
nobody
vcsa
abrt
ntp
saslauth
postfix
sshd
dbus
tcpdump
cairui
nginx
mysql
zabbix
[root@VM_0_7_centos ~]# awk -F":" '{print $0}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
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
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
saslauth:x:499:76:Saslauthd user:/var/empty/saslauth:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
cairui:x:500:500::/home/cairui:/bin/bash
nginx:x:501:501::/home/nginx:/sbin/nologin
mysql:x:502:502::/home/mysql:/sbin/nologin
zabbix:x:503:503::/home/zabbix:/sbin/nologin

  打印1个100行文本的第20到30行

[root@VM_0_7_centos ~]# seq 100 | awk '{if(NR>=20 && NR<=30) print $1}'
20
21
22
23
24
25
26
27
28
29
30

[root@VM_0_7_centos tmp]# awk -F"[ ,]+" '{print $3" "$6}' test 
cai is
[root@VM_0_7_centos tmp]# cat test 
I am cai,my qq is

[root@VM_0_7_centos tmp]# awk '{count++;print $0;} END{print "user count is ",count}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
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
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
saslauth:x:499:76:Saslauthd user:/var/empty/saslauth:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
cairui:x:500:500::/home/cairui:/bin/bash
nginx:x:501:501::/home/nginx:/sbin/nologin
mysql:x:502:502::/home/mysql:/sbin/nologin
zabbix:x:503:503::/home/zabbix:/sbin/nologin
user count is  27

[root@VM_0_7_centos tmp]# ll
total 16
-rw-r--r-- 1 root root  12 Mar 21 11:08 1.txt
-rw-r--r-- 1 root root  11 Mar 21 11:08 2.txt
-rw-r--r-- 1 root root 616 Mar 21 13:44 services
-rw-r--r-- 1 root root  18 Mar 22 14:30 test
[root@VM_0_7_centos tmp]# ll |awk 'BEGIN{size=0;} {size=size+$5} END{print "[end] size is ",size}'  统计所占的字节数
[end] size is  657

awk工作流程

  • 第一步:执行BEGIN{action;… }语句块中的语句
  • 第二步:从文件或标准输入(stdin)读取一行,然后执行pattern{ action;… }语句块,它逐行扫描文件,从第一行到最后一行重复这 个过程,直到文件全部被读取完毕。
  • 第三步:当读至输入流末尾时,执行END{action;…}语句块。
    .
  • BEGIN语句块在awk开始从输入流中读取行之前被执行,这是一个可选的语句块,比如变量初始化、打印输出表格的表头等语句通常 可以写在BEGIN语句块中
  • END语句块在awk从输入流中读取完所有的行之后即被执行,比如打印所有行的分析结果这类信息汇总都是在END语句块中完成,它 也是一个可选语句块
  • pattern语句块中的通用命令是最重要的部分,也是可选的。如果 没有提供pattern语句块,则默认执行{ print },即打印每一个读取 到的行,awk读取的每一行都会执行该语句块

d:删除匹配内容所在的行。

运算符

[root@VM_0_7_centos tmp]# awk 'BEGIN{a=5;a+=5;print a}'
10

[root@VM_0_7_centos tmp]# awk 'BEGIN{a=1;b=2;print (a>2&&b>1,a=1||b>1)}'
0 1

[root@VM_0_7_centos tmp]# awk 'BEGIN{a=11;if(a>=9){print "ok"}}'
ok

[root@VM_0_7_centos tmp]# awk -F ":" 'NF==8{print $0}' ll  打印字段数为8的行
zabbix:x:503:503::/home/zabbix:/sbin/nologin:ll
[root@VM_0_7_centos tmp]# cat ll
tcpdump:x:72:72::/:/sbin/nologin
cairui:x:500:500::/home/cairui:/bin/bash
nginx:x:501:501::/home/nginx:/sbin/nologin
mysql:x:502:502::/home/mysql:/sbin/nologin
zabbix:x:503:503::/home/zabbix:/sbin/nologin:ll

[root@VM_0_7_centos tmp]# ifconfig eth0
eth0      Link encap:Ethernet  HWaddr 52:54:00:BE:3B:97  
          inet addr:172.17.0.7  Bcast:172.17.15.255  Mask:255.255.240.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:10059201 errors:0 dropped:0 overruns:0 frame:0
          TX packets:9797173 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:1673765442 (1.5 GiB)  TX bytes:2246121551 (2.0 GiB)

[root@VM_0_7_centos tmp]# ifconfig eth0 | awk -F [" ":]+ 'NR==2{print $4}'  NR==2是取第二行
172.17.0.7

awk内置命令

a:在指定行后添加一行或多行。

正则

图片 6

[root@VM_0_7_centos tmp]# awk '/root/{print $0}' /etc/passwd  打印所有root行
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
print

print item1, item2, …

特性

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

i:在指定行前添加一行或多行。(后为添加内容)

awk中的if

{
        if ($1=="foo"){
                if($2=="foo"){
                        print "uno"
                }else{
                        print "one"
                }
        }elseif($1=="bar"){
                print "two"
        }else{
                print "three"
        }
}

  awk参考:

printf

printf “FORMAT”, item1, item2, …

特性

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

FORMAT=格式符+修饰符

  • 格式符
    • %c: 显示字符的ASCII码 
    • %d, %i: 显示十进制整数 
    • %e, %E:显示科学计数法数值
    • %f: 显示为浮点数
    • %g, %G:以科学计数法或浮点形式显示数值 
    • %s: 显示字符串
    • %u: 无符号整数
    • %%: 显示%自身
  • 修饰符:
    • #[.#]: 第一个数字控制显示的宽度,第二个#表示小数点后精度
    • -: 左对齐(默认右对齐) %-15s
    • +: 显示数值的正负符号 %+d

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@7-movekj ~]$ awk 'BEGIN{print "Colum1,Colum2"}'
Colum1,Colum2
[root@7-movekj ~]$ awk 'BEGIN{printf "%-10s,%8sn","Colum1","Colum2"}'
Colum1    ,  Colum2
[root@7-movekj ~]$ awk 'BEGIN{printf "%-10s,%-8sn","Colum1","Colum2"}'
Colum1    ,Colum2  
[root@7-movekj ~]$ awk 'BEGIN{printf "%.2f",2}'
2.00
[root@7-movekj ~]$ awk 'BEGIN{printf "%10.2f",2}'
      2.00[root@7-movekj ~]$ awk 'BEGIN{printf "%-10.2f",2}'
2.00      [root@7-movekj ~]$ awk 'BEGIN{printf "%-10.2f",3}'
3.00      [root@7-movekj ~]$ awk 'BEGIN{printf "%-10.2d",3}'
03        [root@7-movekj ~]$ awk 'BEGIN{printf "%10.2d",3}'
        03[root@7-movekj ~]$ awk 'BEGIN{printf "%10.3d",3}'
       003[root@7-movekj ~]$
 

 

s:查找替换 (s/查找要替换的内容/新替换的字符串/ i不区分大小学 g 全局替换查找)

awk变量

pattern支持正则表达式,与grep中的使用格式相同。

内置变量
  • FS: 输入字段分隔符,默认为空白字符
  • OFS: 输出字段分隔符,默认为空白字符
  • RS: 输入记录分隔符,指定输入时的换行符,原换行符仍有效
  • ORS: 输出记录分隔符,输出时用指定符号代替换行符
  • NF: 当前行的字段数量
  • NR: 当前行的行号
  • FNR: 各文件分别计数,行号
  • FILENAME: 当前文件名
  • ARGC: 命令行参数的个数
  • ARGV: 数组,保存的是命令行所给定的各参数 

注意:在使用正则表达式时,一旦用到元字符,则该这个正则表达式必须加引号。

自定义变量(区分字符大小写)
  • -v var=value
  • 在program中直接定义

 

 

1
2
3
4
5
[root@7-movekj ~]$ awk -v test='hello gawk' 'BEGIN{print test}'
hello gawk
[root@7-movekj ~]$ awk 'BEGIN{test="hello,gawk";print test}'
hello,gawk
 

 

option:

awk操作符

  • 算术操作符: x+y, x-y, x*y, x/y, x^y, x%y
  • -x: 转换为负数
  • +x: 转换为数值
  • 字符串操作符: 没有符号的操作符,字符串连接 
  • 赋值操作符: =, +=, -=, *=, /=, %=, ^=,++, —
  • 比较操作符: ==, !=, >, >=, <, <=
  • 模式匹配符: 支持正则表达式
    • ~: 左边是否和右边匹配包含
    • !~: 是否不匹配
  • 逻辑操作符:与&&,或||,非!
  • 条件表达式(三目表达式): selector?if-true-expression:if-false-expression

-n 取消默认显示输出 使显示匹配内容

awk action

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

-e 在一个sed语句中加入多个限制条件,每个均以-e开头

awk 控制语句

-f 在-f选项后可直接跟一个脚本,sed就以此脚本导入限制条件

分支语句
  • if(condition){statement;…}[else statement]
  • if(condition1){statement1}else if(condition2){statement2}else{statement3}
  • switch(expression){case VALUE1 or /REGEXP/: statement1; case VALUE2 or /REGEXP2/: statement2; …; default: statementN}

-i 在sed中加入该选项,将把原来对内存的

循环语句
  • while(condition){statement;…}
  • do{statement;…}while(condition)
  • for(expr1;expr2;expr3) {statement;…}

eg:

控制语句
  • next: 提前结束对本行处理而直接进入下一行处理
  • break [n] 
  • continue [n]

sed /关键字/  文件目录

awk 数组

[root@www.linuxidc.com tmp]# sed -n /id/p /etc/inittab #若要其显示内容p命令必不可少,只显示匹配则需要-n选项

数组格式

array[index]

  • index
    • 可使用任意字符串;字符串要使用双引号括起来
    • 如果某数组元素事先不存在,在引用时,awk会自动创建此元素,并将其值初始化为“空串”

sed 地址1,地址2  文件目录 #地址信息包括:行号、字符串和正则表达式。

数组遍历

for(idx in array){for-body}

[root@www.linuxidc.com tmp]# sed -n 2,5p /etc/inittab #显示2~5行的所有内容

awk函数

[root@www.linuxidc.com tmp]# sed -n /bug/,/bug/p /proc/cpuinfo #从带有bug字符串的第一行显示到最后一行

内置函数
  • rand(): 返回0和1之间一个随机数,使用之前需要先调用srand()函数

 

 

1
2
awk 'BEGIN{srand(); for (i=1;i<=10;i++)print int(rand()*100) }'
 

 

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

     

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

 

 

1
2
echo "2008:08:08 08:08:08" | awk 'sub(/:/,“-",$1)'
 

 

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

 

 

1
2
echo "2008:08:08 08:08:08" | awk ‘gsub(/:/,“-",$0)'
 

 

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

 

 

1
2
netstat -tan | awk '/^tcp>/{split($5,ip,":");count[ip[1]]++} END{for (i in count) {print i,count[i]}}
 

 

fdiv_bug  : no

自定义函数

语法

 

 

1
2
3
4
5
function name ( parameter, parameter, ... ) {
        statements
        return expression
}
 

 

示例

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@7-movekj awk]$ cat fun.awk
#!/bin/awk -f
function max(v1,v2) {
v1>v2?var=v1:var=v2
return var
}
BEGIN{
a=3
b=2
print max(a,b)
}
 
[root@7-movekj awk]$ awk –f fun.awk
 

 

hlt_bug           : no

awk中调用shell命令

空格是awk中的字符串连接符,如果system中需要使用awk中 的变量可以使用空格分隔,或者说除了awk的变量外其他一律 用””引用起来。

示例:

 

 

1
2
3
4
5
[root@7-movekj awk]$ awk 'BEGIN{system("hostname") }'
7-movekj.com
[root@7-movekj awk]$ awk 'BEGIN{score=100; system("echo your score is " score) }'
your score is 100
 

 

f00f_bug : no

awk 脚本

coma_bug      : no

普通awk脚本

示例

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[root@7-movekj awk]$ cat f1.awk
#!/bin/awk -f
 
{if($3>=1000)print $1,$3}
 
[root@7-movekj awk]$ ./f1.awk -F: /etc/passwd | head  -3
nfsnobody 65534
starli 1000
gentoo 1001
 
[root@7-movekj awk]$ cat f2.awk
{if($3>=1000)print $1,$3}
 
[root@7-movekj awk]$ awk -F: -f f2.awk /etc/passwd | head -3
nfsnobody 65534
starli 1000
gentoo 1001
 

 

[root@www.linuxidc.com tmp]# sed -n '/^cache/p' /proc/cpuinfo #以cache开头的行(正则表达式用到元字符必须加引号!)

带变量的awk脚本

这种方式传递给awk脚本的变量在BEGIN过程中不可用。直到首行输入完成以后,变量才可用。可以通过-v参数,让awk在执行BEGIN之前得到变量的值。命令行中每一个指定的变量都需要一个-v参数

 

 1 [root@7-movekj awk]$ cat f3.awk
 2 #!/bin/awk -f
 3 {if($3 >=min && $3<=max)print $1,$3}
 4 [root@7-movekj awk]$ chmod +x f3.awk
 5 [root@7-movekj awk]$ ./f3.awk -F: min=100 max=200 /etc/passwd
 6 systemd-network 192
 7 abrt 173
 8 usbmuxd 113
 9 rtkit 172
10 qemu 107
11 pulse 171

 

 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
[root@7-movekj awk]$ cat f3.awk
#!/bin/awk -f
{if($3 >=min && $3<=max)print $1,$3}
[root@7-movekj awk]$ chmod +x f3.awk
[root@7-movekj awk]$ ./f3.awk -F: min=100 max=200 /etc/passwd
systemd-network 192
abrt 173
usbmuxd 113
rtkit 172
qemu 107
pulse 171
 

[root@www.linuxidc.com tmp]# sed  '/^processor/ a#this is my cpu!' /proc/cpuinfo # a命令故不能在出现p命令了,i的命令与之相同。

awk

awk是行处理器: 相比较屏幕处理的优点,在处理庞大文件时不会出现内存溢出或是处理缓慢的问题,通常用来格式化文本信息

awk处理过程: 依次对每一行进行处理,然后输出

awk命令形式:

awk [-F|-f|-v] ‘BEGIN{} //{command1; command2} END{}’ file

 [-F|-f|-v]   大参数,-F指定分隔符,-f调用脚本,-v定义变量 var=value

'  '          引用代码块

BEGIN   初始化代码块,在对每一行进行处理之前,初始化代码,主要是引用全局变量,设置FS分隔符

//           匹配代码块,可以是字符串或正则表达式

{}           命令代码块,包含一条或多条命令

;          多条命令使用分号分隔

END      结尾代码块,在对每一行进行处理之后再执行的代码块,主要是进行最终计算或输出结尾摘要信息

 

特殊要点:

$0           表示整个当前行

$1           每行第一个字段

NF          字段数量变量

NR          每行的记录号,多文件记录递增

FNR        与NR类似,不过多文件记录不递增,每个文件都从1开始

t            制表符

n           换行符

FS          BEGIN时定义分隔符

RS       输入的记录分隔符, 默认为换行符(即文本是按一行一行输入)

~            匹配,与==相比不是精确比较

!~           不匹配,不精确比较

==         等于,必须全部相等,精确比较

!=           不等于,精确比较

&&      逻辑与

||             逻辑或

+            匹配时表示1个或1个以上

/[0-9][0-9]+/   两个或两个以上数字

/[0-9][0-9]*/    一个或一个以上数字

FILENAME 文件名

OFS       输出字段分隔符, 默认也是空格,可以改为制表符等

ORS         输出的记录分隔符,默认为换行符,即处理结果也是一行一行输出到屏幕

-F'[:#/]'   定义三个分隔符

 

print & $0

print 是awk打印指定内容的主要命令

awk '{print}'  /etc/passwd   ==   awk '{print $0}'  /etc/passwd  

awk '{print " "}' /etc/passwd                                           //不输出passwd的内容,而是输出相同个数的空行,进一步解释了awk是一行一行处理文本

awk '{print "a"}'   /etc/passwd                                        //输出相同个数的a行,一行只有一个a字母

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

awk -F: '{print $1; print $2}'   /etc/passwd                   //将每一行的前二个字段,分行输出,进一步理解一行一行处理文本

awk  -F: '{print $1,$3,$6}' OFS="t" /etc/passwd        //输出字段1,3,6,以制表符作为分隔符

 

-f指定脚本文件

awk -f script.awk  file

BEGIN{

FS=":"

}

{print $1}               //效果与awk -F":" '{print $1}'相同,只是分隔符使用FS在代码自身中指定

 

awk 'BEGIN{X=0} /^$/{ X+=1 } END{print "I find",X,"blank lines."}' test 

I find 4 blank lines.

 ls -l|awk 'BEGIN{sum=0} !/^d/{sum+=$5} END{print "total size is",sum}'                    //计算文件大小

total size is 17487

 

-F指定分隔符

$1 指指定分隔符后,第一个字段,$3第三个字段, t是制表符

一个或多个连续的空格或制表符看做一个定界符,即多个空格看做一个空格

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

awk -F":" '{print $1 $3}'  /etc/passwd                       //$1与$3相连输出,不分隔

awk -F":" '{print $1,$3}'  /etc/passwd                       //多了一个逗号,$1与$3使用空格分隔

awk -F":" '{print $1 " " $3}'  /etc/passwd                  //$1与$3之间手动添加空格分隔

awk -F":" '{print "Username:" $1 "tt Uid:" $3 }' /etc/passwd       //自定义输出  

awk -F: '{print NF}' /etc/passwd                                //显示每行有多少字段

awk -F: '{print $NF}' /etc/passwd                              //将每行第NF个字段的值打印出来

 awk -F: 'NF==4 {print }' /etc/passwd                       //显示只有4个字段的行

awk -F: 'NF>2{print $0}' /etc/passwd                       //显示每行字段数量大于2的行

awk '{print NR,$0}' /etc/passwd                                 //输出每行的行号

awk -F: '{print NR,NF,$NF,"t",$0}' /etc/passwd      //依次打印行号,字段数,最后字段值,制表符,每行内容

awk -F: 'NR==5{print}'  /etc/passwd                         //显示第5行

awk -F: 'NR==5 || NR==6{print}'  /etc/passwd       //显示第5行和第6行

route -n|awk 'NR!=1{print}'                                       //不显示第一行

 

//匹配代码块

//纯字符匹配   !//纯字符不匹配   ~//字段值匹配    !~//字段值不匹配   ~/a1|a2/字段值匹配a1或a2   

awk '/mysql/' /etc/passwd

awk '/mysql/{print }' /etc/passwd

awk '/mysql/{print $0}' /etc/passwd                   //三条指令结果一样

awk '!/mysql/{print $0}' /etc/passwd                  //输出不匹配mysql的行

awk '/mysql|mail/{print}' /etc/passwd

awk '!/mysql|mail/{print}' /etc/passwd

awk -F: '/mail/,/mysql/{print}' /etc/passwd         //区间匹配

awk '/[2][7][7]*/{print $0}' /etc/passwd               //匹配包含27为数字开头的行,如27,277,2777...

awk -F: '$1~/mail/{print $1}' /etc/passwd           //$1匹配指定内容才显示

awk -F: '{if($1~/mail/) print $1}' /etc/passwd     //与上面相同

awk -F: '$1!~/mail/{print $1}' /etc/passwd          //不匹配

awk -F: '$1!~/mail|mysql/{print $1}' /etc/passwd        

 

IF语句

必须用在{}中,且比较内容用()扩起来

awk -F: '{if($1~/mail/) print $1}' /etc/passwd                                       //简写

awk -F: '{if($1~/mail/) {print $1}}'  /etc/passwd                                   //全写

awk -F: '{if($1~/mail/) {print $1} else {print $2}}' /etc/passwd            //if...else...

 

 

条件表达式

==   !=   >   >=  

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

awk -F":" '{if($1=="mysql") print $3}' /etc/passwd          //与上面相同 

awk -F":" '$1!="mysql"{print $3}' /etc/passwd                 //不等于

awk -F":" '$3>1000{print $3}' /etc/passwd                      //大于

awk -F":" '$3>=100{print $3}' /etc/passwd                     //大于等于

awk -F":" '$3<1{print $3}' /etc/passwd                            //小于

awk -F":" '$3<=1{print $3}' /etc/passwd                         //小于等于

 

逻辑运算符

&& || 

awk -F: '$1~/mail/ && $3>8 {print }' /etc/passwd         //逻辑与,$1匹配mail,并且$3>8

awk -F: '{if($1~/mail/ && $3>8) print }' /etc/passwd

awk -F: '$1~/mail/ || $3>1000 {print }' /etc/passwd       //逻辑或

awk -F: '{if($1~/mail/ || $3>1000) print }' /etc/passwd 

 

数值运算

awk -F: '$3 > 100' /etc/passwd    

awk -F: '$3 > 100 || $3 < 5' /etc/passwd  

awk -F: '$3+$4 > 200' /etc/passwd

awk -F: '/mysql|mail/{print $3+10}' /etc/passwd                    //第三个字段加10打印 

awk -F: '/mysql/{print $3-$4}' /etc/passwd                             //减法

awk -F: '/mysql/{print $3*$4}' /etc/passwd                             //求乘积

awk '/MemFree/{print $2/1024}' /proc/meminfo                  //除法

awk '/MemFree/{print int($2/1024)}' /proc/meminfo           //取整

 

输出分隔符OFS

awk '$6 ~ /FIN/ || NR==1 {print NR,$4,$5,$6}' OFS="t" netstat.txt

awk '$6 ~ /WAIT/ || NR==1 {print NR,$4,$5,$6}' OFS="t" netstat.txt        

//输出字段6匹配WAIT的行,其中输出每行行号,字段4,5,6,并使用制表符分割字段

 

输出处理结果到文件

①在命令代码块中直接输出    route -n|awk 'NR!=1{print > "./fs"}'   

②使用重定向进行输出           route -n|awk 'NR!=1{print}'  > ./fs

 

格式化输出

netstat -anp|awk '{printf "%-8s %-8s %-10sn",$1,$2,$3}' 

printf表示格式输出

%格式化输出分隔符

-8长度为8个字符

s表示字符串类型

打印每行前三个字段,指定第一个字段输出字符串类型(长度为8),第二个字段输出字符串类型(长度为8),

第三个字段输出字符串类型(长度为10)

netstat -anp|awk '$6=="LISTEN" || NR==1 {printf "%-10s %-10s %-10s n",$1,$2,$3}'

netstat -anp|awk '$6=="LISTEN" || NR==1 {printf "%-3s %-10s %-10s %-10s n",NR,$1,$2,$3}'

 

IF语句

awk -F: '{if($3>100) print "large"; else print "small"}' /etc/passwd

small

small

small

large

small

small

awk -F: 'BEGIN{A=0;B=0} {if($3>100) {A++; print "large"} else {B++; print "small"}} END{print A,"t",B}' /etc/passwd 

                                                                                                                  //ID大于100,A加1,否则B加1

awk -F: '{if($3<100) next; else print}' /etc/passwd                         //小于100跳过,否则显示

awk -F: 'BEGIN{i=1} {if(i<nf) print="" nr,nf,i++="" }'="" etc="" passwd=""   <="" span="">

awk -F: 'BEGIN{i=1} {if(i<nf) {print="" nr,nf}="" i++="" }'="" etc="" passwd<="" span="">

另一种形式

awk -F: '{print ($3>100 ? "yes":"no")}'  /etc/passwd 

awk -F: '{print ($3>100 ? $3":tyes":$3":tno")}'  /etc/passwd

 

while语句

awk -F: 'BEGIN{i=1} {while(i<nf) print="" nf,$i,i++}'="" etc="" passwd ="" <="" div="">

7 root 1

7 x 2

7 0 3

7 0 4

7 root 5

7 /root 6

 

数组

netstat -anp|awk 'NR!=1{a[$6]++} END{for (i in a) print i,"t",a[i]}'

netstat -anp|awk 'NR!=1{a[$6]++} END{for (i in a) printf "%-20s %-10s %-5s n", i,"t",a[i]}'

9523                               1     

9929                               1     

LISTEN                            6     

7903                               1     

3038/cupsd                   1     

7913                               1     

10837                             1     

9833                               1     

 

应用1

awk -F: '{print NF}' helloworld.sh                                                       //输出文件每行有多少字段

awk -F: '{print $1,$2,$3,$4,$5}' helloworld.sh                                 //输出前5个字段

awk -F: '{print $1,$2,$3,$4,$5}' OFS='t' helloworld.sh                 //输出前5个字段并使用制表符分隔输出

awk -F: '{print NR,$1,$2,$3,$4,$5}' OFS='t' helloworld.sh           //制表符分隔输出前5个字段,并打印行号

 

应用2

awk -F'[:#]' '{print NF}'  helloworld.sh                                                  //指定多个分隔符: #,输出每行多少字段

awk -F'[:#]' '{print $1,$2,$3,$4,$5,$6,$7}' OFS='t' helloworld.sh   //制表符分隔输出多字段

 

应用3

awk -F'[:#/]' '{print NF}' helloworld.sh                                               //指定三个分隔符,并输出每行字段数

awk -F'[:#/]' '{print $1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12}' helloworld.sh     //制表符分隔输出多字段

 

应用4

计算/home目录下,普通文件的大小,使用KB作为单位

ls -l|awk 'BEGIN{sum=0} !/^d/{sum+=$5} END{print "total size is:",sum/1024,"KB"}'

ls -l|awk 'BEGIN{sum=0} !/^d/{sum+=$5} END{print "total size is:",int(sum/1024),"KB"}'         //int是取整的意思

 

应用5

统计netstat -anp 状态为LISTEN和CONNECT的连接数量分别是多少

netstat -anp|awk '$6~/LISTEN|CONNECTED/{sum[$6]++} END{for (i in sum) printf "%-10s %-6s %-3s n", i," ",sum[i]}'

 

应用6

统计/home目录下不同用户的普通文件的总数是多少?

ls -l|awk 'NR!=1 && !/^d/{sum[$3]++} END{for (i in sum) printf "%-6s %-5s %-3s n",i," ",sum[i]}'   

mysql        199 

root           374 

统计/home目录下不同用户的普通文件的大小总size是多少?

ls -l|awk 'NR!=1 && !/^d/{sum[$3]+=$5} END{for (i in sum) printf "%-6s %-5s %-3s %-2s n",i," ",sum[i]/1024/1024,"MB"}'

 

应用7

输出成绩表

awk 'BEGIN{math=0;eng=0;com=0;printf "Lineno.   Name    No.    Math   English   Computer    Totaln";printf "------------------------------------------------------------n"}{math+=$3; eng+=$4; com+=$5;printf "%-8s %-7s %-7s %-7s %-9s %-10s %-7s n",NR,$1,$2,$3,$4,$5,$3+$4+$5} END{printf "------------------------------------------------------------n";printf "%-24s %-7s %-9s %-20s n","Total:",math,eng,com;printf "%-24s %-7s %-9s %-20s n","Avg:",math/NR,eng/NR,com/NR}' test0

[root@localhost home]# cat test0 

Marry   2143 78 84 77

Jack    2321 66 78 45

Tom     2122 48 77 71

Mike    2537 87 97 95

Bob     2415 40 57 62

图片 7

 

awk手册

 

processor       : 0

#this is my cpu!

vendor_id       : GenuineIntel

….

[root@www.linuxidc.com tmp]# sed '1,$s/yes/YES!/g' /proc/cpuinfo 

# 查找范围1,$表示1到最后一行,s/ 匹配并替换的内容 / 新替换字段 / g表示匹配行内全局替换。

[root@www.linuxidc.com tmp]# sed  '/^[[:space:]]*#/d' /etc/inittab

#删除显示内容中以 0个或多个空白字符紧接#开头的行

 

下面说说awk,awk不仅是linux也是任何环境中现有功能最强大的数据处理引擎之一,它不仅支持简单的查找命令而且支持创建简短的程序,这些程序可以实现数据排序、处理数据、输入计算以及生成报表。与其说他是一款数据处理程序倒不如说他是一种用于文件的编程语言工具。

awk的格式:awk的命令有模式pattern和操作action组成,模式pattern由两斜杠之间的正则表达式和一个或多个awk操作符组成;操作action由括在大括号内的一条或多条语句组成,语句之间用分号隔开。注意pattern中的正则表达式两端必须加/ /,action的两端必须加{ }。具体格式如下:

[root@www.linuxidc.com ~]# awk  'pattern{action}'  filename

awk的格式化输出:

print命令

awk默认将整个文本以换行符分成若干个record,将每record以空格分成了若干个field。

每个field分别对应$1$2$3…$n,整个record即1..n的总和为$0。

并且用一下几个内置变量来定义:

FS:输入字段分隔符,默认为空格

RS:输入行分隔符,默认为换行符

OFS:输出字段分隔符,默认问空格

ORS:输出行分隔符,默认为换行符

NF:当前记录中的字段数

NR:当前的行数

BEGIN模式

BEGIN+操作块,awk必须在输入文件在进行任何处理之前执行BEGIN后的模块.

eg:

[root@www.linuxidc.com ~]# awk 'BEGIN{FS=":";OFS="-"}{print $1,$2}' /etc/passwd

#分析:输入文件在未执行任何操作之前,将FS和OFS分别替换,然后输出被新分隔符分割的字段 1 和 2 。

END模式

END+操作块,此模式不匹配任何输入行,而是执行任何与之关联的操作。即awk在处理完成输出前执行END+操作块。

eg:

[root@www.linuxidc.com ~]# awk 'BEGIN{FS=":";OFS="-"}{print $1,$2}END{print "show complet!"}' /etc/passwd

#在输出结果后加入字符串show complet!

[root@www.linuxidc.com ~]# awk 'BEGIN{FS=":";OFS="-"}{print NR":"$1,$2}END{print "show complet!"}' /etc/passwd

1:root-x

2:bin-x

3:daemon-x

4:adm-x

5:lp-x

6:sync-x

7:shutdown-x

#此为print中加入NR的效果,显示了行号;并且还显示了额外字符串”: ”,print命令和C语言中的相同 输出变量时不需要家任何修饰符,输出文本内容则要加上” ”双引号。

图片 8

编辑:操作系统 本文来源:sed通过限制条件对文本进行行读取,  -e匹配多

关键词: