正则表达式

一.正则表达式

REGEXP: Regular Expressions,由一类特殊字符及文本字符所编写的模式,其中有些字符(元字符)

不表示字符字面意义,而表示控制或通配的功能,类似于增强版的通配符功能,但与通配符不同,通配

符功能是用来处理文件名,而正则表达式是处理文本内容中字符

正则表达式被很多程序和开发语言所广泛支持:vim, less,grep,sed,awk, nginx,mysql 等

主要用来匹配字符串(命令结果,文本内容),

通配符匹配文件(而且是已存在的文件)

  • 基本正则表达式

  • 扩展正则表达式

可以使用

man 7 regex
可以使用 man手册帮助
1.1.1 元字符

元字符:

.   匹配任意单个字符,可以是一个汉字
[]   匹配指定范围内的任意单个字符,示例:[zhou]   [0-9]   []   [a-zA-Z]
[^] 匹配指定范围外的任意单个字符,示例:[^zhou] [^a.z] a.z


[:alnum:] 字母和数字
[:alpha:] 代表任何英文大小写字符,亦即 A-Z, a-z
[:lower:] 小写字母,示例:[[:lower:]],相当于[a-z]
[:upper:] 大写字母
[:blank:] 空白字符(空格和制表符)
[:space:] 包括空格、制表符(水平和垂直)、换行符、回车符等各种类型的空白,比[:blank:]包含的范围
广
[:cntrl:] 不可打印的控制字符(退格、删除、警铃...)
[:digit:] 十进制数字
[:xdigit:]十六进制数字
[:graph:] 可打印的非空白字符
[:print:] 可打印字符
[:punct:] 标点符号
\w #匹配单词构成部分,等价于[_[:alnum:]]
\W #匹配非单词构成部分,等价于[^_[:alnum:]]
\S     #匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。
\s     #匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。注意
Unicode 正则表达式会匹配全角空格符

元字符点(.)

[root@localhost ~]#ls /etc/|grep rc[.0-6]
#此处的点代表字符
rc0.d
rc1.d
rc2.d
rc3.d
rc4.d
rc5.d
rc6.d
rc.d
rc.local
[root@localhost ~]#ls /etc/ | grep 'rc\.'
#点值表示点需要转义
rc.d
rc.local

[root@localhost ~]# grep r..t /etc/passwd         
#r..t ..代表任意两个字符    
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
[root@localhost ~]# echo abc |grep a.c              
#表示原来的点需要加\转义
abc
[root@localhost ~]# echo abc |grep a\.c
#不加引号有时匹配会有出入
abc
[root@localhost ~]# echo abc |grep 'a\.c'          
#标准格式需要加'' 或者""

[root@localhost ~]# ls |grep '[zhou].txt'    
#匹配[]中任意一个字符
h.txt
o.txt
u.txt
z.txt
[root@localhost ~]# ls [a-d].txt                
#通配符
a.txt  A.txt  b.txt  B.txt  c.txt  C.txt  d.txt
[root@localhost ~]# ls |grep '[a-d].txt'             
#真正的小写在正则表达式中
a.txt
b.txt
c.txt
d.txt
[root@localhost ~]# ls |grep '[^a-z].txt'   
#显示非小写字母
A.txt
B.txt

[root@localhost ~]# ls |grep '[^a.z].txt'     
#[]里就是本意不需要转义

space空格
[root@localhost ky15]#grep [[:space:]] zhen.txt 
hhh  
jj		l
kkk  
[root@localhost ky15]#grep [[:space:]] zhen.txt |cat -A
hhh  $
jj^I^Il$
kkk  $


1.1.2 表示次数
* #匹配前面的字符任意次,包括0次,贪婪模式:尽可能长的匹配
.* #任意长度的任意字符
\? #匹配其前面的字符出现0次或1次,即:可有可无
\+ #匹配其前面的字符出现最少1次,即:肯定有且 >=1 次
\{n\} #匹配前面的字符n次
\{m,n\} #匹配前面的字符至少m次,至多n次
\{,n\}  #匹配前面的字符至多n次,<=n
\{n,\}  #匹配前面的字符至少n次

举例:

[root@localhost ~]# echo google |grep 'go\{2\}gle'
#带表前面的o出现2次
google
[root@localhost ~]# echo gooooogle |grep 'go\{2,\}gle'  
#带表前面的o出现2次以上
gooooogle
[root@localhost ~]# echo gooooogle |grep 'go\{2,5\}gle'
#带表前面的o出现2次以上5次以下
gooooogle
[root@localhost ~]# echo goooooogle |grep 'go\{2,5\}gle'
[root@localhost ~]# 
[root@localhost ~]# echo goooooogle |grep 'go*gle'    
#表示0次到任意次
goooooogle
[root@localhost ~]# echo ggle |grep "go*gle"
ggle
[root@localhost ~]# echo gggle |grep "go*gle"    
#grep 包含最前面的g不匹配
gggle
[root@localhost ~]# echo gdadadadgle |grep "g.*gle"    
#.*代表任意匹配所有
gdadadadgle
[root@localhost ~]# echo ggle |grep "go\?gle"      
# \?一次或者0次
ggle
[root@localhost ~]# echo gogle |grep "go\?gle"
gogle
[root@[root@localhost ~]# echo google |grep "go\+gle"   
#一个以上
google
[root@localhost ~]# echo gogle |grep "go\+gle"
gogle
[root@localhost ~]# echo ggle |grep "go\+gle"
[root@localhost ~]# echo google |grep "go\?gle"

1.1.3位置锚定
^ #行首锚定, 用于模式的最左侧
$ #行尾锚定,用于模式的最右侧
^PATTERN$ #用于模式匹配整行 (单独一行  只有root)
^$ #空行
^[[:space:]]*$ #空白行
\< 或 \b   #词首锚定,用于单词模式的左侧(连续的数字,字母,下划线都算单词内部)
\> 或 \b        #词尾锚定,用于单词模式的右侧
\<PATTERN\>     #匹配整个单词

例子:

思考过滤出不是已#号开头的非空行
[root@localhost ~]#grep "^[^#]" /etc/fstab

[root@localhost ~]#grep "^[[:space:]]*$" /etc/fstab

[root@localhost ~]#echo hello-123 |grep "\<123"
hello-123
[root@localhost ~]#echo hello 123 |grep "\<123"
hello 123

1.1.4分组或其他

分组:() 将多个字符捆绑在一起,当作一个整体处理,如:(root)+

后向引用:分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命名

方式为: \1, \2, \3, …

\1 表示从左侧起第一个左括号以及与之匹配右括号之间的模式所匹配到的字符

或者

或者
或者:\|

示例

[root@localhost ~]#echo abccc |grep "abc\{3\}"
abccc

[root@localhost ~]#echo abcabcabc |grep "\(abc\)\{3\}"
#分组
abcabcabc
[root@localhost ~]#echo 1abc |grep  "1\|2abc"
#只匹配了1
1abc

[root@localhost ~]#echo 1abc |grep  "\(1\|2\)abc"
#1abc或者2abc
1abc

[root@localhost ~]#ifconfig ens33|grep netmask|grep -o '\([0-9]\{1,3\}\.\)\{3\}[0-9]\{3\}'|head -1
192.168.91.100

[root@localhost ~] ens33 |grep netmask|grep -Eo '([0-9]{1,3}.){3}[0-9]{1,3}'|head -1


[root@localhost ky15]#ifconfig ens33 |grep netmask|grep -Eo '([0-9]{1,3}.){4}'



1.1.5 扩展正则表达式(表示字符相差不大)

表示次数

*   匹配前面字符任意次
? 0或1次
+ 1次或多次
{n} 匹配n次
{m,n} 至少m,至多n次
{,n}  #匹配前面的字符至多n次,<=n,n可以为0
{n,} #匹配前面的字符至少n次,<=n,n可以为0

表示分组

() 分组
分组:() 将多个字符捆绑在一起,当作一个整体处理,如:\(root\)+
后向引用:\1, \2, ...
| 或者  
a|b #a或b
C|cat #C或cat
(C|c)at #Cat或cat

1.2 grep

grep [选项]… 查找条件 目标文件

  • -i:查找时忽略大小写
  • -v:反向查找,输出与查找条件不相符的行
  • -o 只显示匹配项
  • -f 对比两个文件的相同行
  • -c 匹配的行数([root@localhost ky15]# grep -c root passwd 2)
[root@test1 opt]# cat 123.txt |grep -v '^$' >test.txt  //将非空行写入到test.txt文件
[root@test1 opt]# grep "^b" 123.txt    //过滤已b开头
[root@test1 opt]#grep '/$'  123.txt    //过滤已/结尾
[root@test1 opt]# grep -v "^$" 123.txt //过滤非空行3 备份与

[root@localhost yum.repos.d]# ifconfig ens33 |grep -o "[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+"
192.168.91.100
255.255.255.0
192.168.91.255
[root@localhost yum.repos.d]# ifconfig ens33 |grep -o "[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+"|head -1
192.168.91.100


###面试题  统计当前主机的连接状态
[root@localhost ~]# ss -nta | grep -v '^State' |cut -d" " -f1|sort |uniq -c
      3 ESTAB
     17 LISTEN
#####统计当前连接主机数
[root@localhost ~]#ss -nt |tr -s " "|cut -d " " -f5|cut -d ":" -f1 |sort|uniq -c
      3 192.168.91.1
      1 192.168.91.101
      1 Address

1.3 sed

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aQHWQR3S-1636356462597)(D:/新建文件夹/WeChat Files/wxid_exqi9v2qqt6p22/FileStorage/File/2021-10/shell脚本.assets/image-20211012234144132.png)]

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

1.3.1基本用法
sed [option]... 'script;script;...' [input  file...]
     选项         自身脚本语法         支持标准输入管道
常用选项:
-n 不输出模式空间内容到屏幕,即不自动打印
-e 多点编辑
-f FILE 从指定文件中读取编辑脚本
-r, -E 使用扩展正则表达式
-i.bak 备份文件并原处编辑
-s           将多个文件视为独立文件,而不是单个连续的长文件流

基本用法

[root@localhost ~]#sed 
#提示错误
[root@localhost ~]#sed ''
####默认将输入内容打印出来
aaa
aaa
dd
dd
dd
dd
[root@localhost ~]#sed '' /etc/fstab 
####查看文件内容
#
# /etc/fstab
# Created by anaconda on Fri Aug  6 20:57:12 2021
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos-root /                       xfs     defaults        0 0
UUID=e9364e9b-a85b-49d7-9652-3a56202e14c8 /boot                   xfs     defaults        0 0
/dev/mapper/centos-swap swap                    swap    defaults        0 0
[root@localhost ~]#sed '' </etc/fstab 
####支持重定向
#
# /etc/fstab
# Created by anaconda on Fri Aug  6 20:57:12 2021
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos-root /                       xfs     defaults        0 0
UUID=e9364e9b-a85b-49d7-9652-3a56202e14c8 /boot                   xfs     defaults        0 0
/dev/mapper/centos-swap swap                    swap    defaults        0 0

[root@localhost ~]#cat /etc/issue |sed ''
#####也支持管道符
\S
Kernel \r on an \m

1.3.2sed脚本格式

单引号中间需要写脚本;脚本格式如下

'地址+命令'组成


1. 不给地址:对全文进行处理(比如行号)
2. 单地址:
   #:指定的行,$:最后一行
   /pattern/:被此处模式所能够匹配到的每一行
3. 地址范围:
   #,#     #从#行到第#行,3,6 从第3行到第6行
   #,+#   #从#行到+#行,3,+4 表示从3行到第7行
   /pat1/,/pat2/    第一个正则表达式和第二个正则表达式之间的行
   #,/pat/  从#号行为开始找到 pat为止 
   /pat/,#  找到#号个pat为止
4. 步进:~
     1~2 奇数行
     2~2 偶数行
     
命令
p 打印当前模式空间内容,追加到默认输出之后
Ip 忽略大小写输出
d 删除模式空间匹配的行,并立即启用下一轮循环
a [\]text 在指定行后面追加文本,支持使用\n实现多行追加
i [\]text 在行前面插入文本
c [\]text 替换行为单行或多行文本
w file 保存模式匹配的行至指定文件
r file 读取指定文件的文本至模式空间中匹配到的行后
= 为模式空间中的行打印行号
! 模式空间中匹配行取反处理
q           结束或退出sed
     
[root@localhost ~]#seq 10 | sed 'p'
#带有自动打印功能,p又再打印一遍
1
1
2
2
3
3
4
4
5
5
6
6
7
7
8
8
9
9
10
10
[root@localhost ~]#seq 10 | sed -n 'p'
#-n 选项关闭自动打印功能
1
2
3
4
5
6
7
8
9
10

#如何加入地址
直接显示第三行
[root@localhost ~]#seq 10 | sed -n '3p'
#直接显示第3行
3
[root@localhost ~]#ifconfig ens33|sed -n 2p
#直接显示第二行内容
        inet 192.168.91.100  netmask 255.255.255.0  broadcast 192.168.91.255


###还支持正则表达式

[root@localhost ~]#sed '/root/p' /etc/passwd
###自动打印需要关闭否则会全部打印
root:x:0:0:root:/root:/bin/bash
省略多行。。。。。。。。
rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin

[root@localhost ~]#sed -n '/root/p' /etc/passwd
##将包含root的行打印出来   /root(需要匹配的内容)/p(打印)  文件名  
###与 grep root /etc/passwd 功能相同
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin


####如何显示范围  行号,行号
[root@localhost ~]#seq 10|sed -n '3,6p'
###显示范围
3
4
5
6
[root@localhost ~]#seq 10|sed -n '3,+4p'
##3 往后加4行
3
4
5
6
7


###还可以匹配 两个正则表达式之间的行
举例子
[root@localhost ~]#cat /etc/passwd
###我想显示b开头 和f开头中间的行
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
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin

[root@localhost ~]#sed -n '/^b/,/^f/p' /etc/passwd
###     基本格式     '/表达式1/,/表达式2/p' (不要忘记打印)p  文件名
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
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
####匹配方式   如果有多个复合条件的表达式
先开始找b开头一直找到f开头
然后再重新找b开头,一找到f开头,没有f开头就全显示
重复循环

######面试题,显示几点到几点分的日志#######
让你查找几点几分到几点几分之间的日志
[root@localhost ~]#sed -n '/2018:08:09/,/2018:09:42:37/p' access_log


#奇数偶数表示
[root@localhost ~]#seq 10|sed -n '1~2p'
1
3
5
7
9
[root@localhost ~]#seq 10|sed -n '2~2p'
2
4
6
8
10
[root@localhost ~]#seq 10|sed -n '3~3p'
3
6
9

-d选项删除
[root@localhost ~]#seq 10 |sed '3d'
###将第三行删除
1
2
4
5
6
7
8
9
10


##修改文件内容,常常用于修改配置文件
-i   与  -i.bak
修改文件  修改文件前先备份
[root@localhost ~]#seq 10 >test.txt
[root@localhost ~]#cat test.txt 
1
2
3
4
5
6
7
8
9
10
[root@localhost ~]#sed -i '2~2d' test.txt 
[root@localhost ~]#cat test.txt 
1
3
5
7
9

#####    -a 追加
[root@localhost ~]#seq 10 |sed '2ahehe'
###第二行后追加hehe
1
2
hehe
3
4
5
6
7
8
9
10
[root@localhost ky15]#sed -i '2a\\n hehe' seq.txt
#修改文件内部需要多加一个\
[root@localhost ~]#seq 10 |sed '2a \ hehe\nhaha'
###\表示空格    \n 表示换行
1
2
 hehe
haha
3
4
5
6
7
8
9
10
[root@localhost ~]#seq 10 |sed '2ihehe'
#第二行前面插入hehe
1
hehe
2
3
4
5
6
7
8
9
10
[root@localhost ~]#seq 10 |sed '2chehe'
#第二行替换成hehe
1
hehe
3
4
5
6
7
8
9
10

[root@localhost ky15]# seq 10 |sed -n '2!p'
#取反
1
3
4
5
6
7
8
9
10

1.3.3搜索替代
s/pattern/string/修饰符 查找替换,支持使用其它分隔符,可以是其它形式:s@@@,s###
替换修饰符:
g 行内全局替换
p 显示替换成功的行
w   /PATH/FILE 将替换成功的行保存至文件中
I,i   忽略大小写
[root@localhost selinux]#sed -i.bak 's/SELINUX=disabled/SELINUX=enable/' /etc/selinux/config 






[root@localhost ~]#sed 's/root/admin/g' /etc/passwd


[root@localhost ~]#echo 123abcxyz |sed -r 's/(123)(abc)(xyz)/\1/'
##分组 s//代表查找替换  ()代表分组    \1 代表留下的组
123
[root@localhost ~]#echo 123xyzabc |sed -r 's/(123)(xyz)(abc)/\1\2/'
123xyz
[root@localhost ~]#echo 123xyzabc |sed -r 's/(123)(xyz)(abc)/\1\3/'
123abc

[root@localhost ~]#ifconfig ens33|sed -rn '2s/.*inet ([0-9.]+) .*/\1/p'
192.168.91.100

[root@localhost selinux]#echo /etc/sysconfig/network-scripts/ifcfg-ens33 |sed -nr 's@^(.*)/([^/]+)@\2@p'
ifcfg-ens33

[root@localhost selinux]#cat 1.txt 2.txt 
123
456
123
abc
[root@localhost selinux]#sed -i -e 's/123/cba/' 1.txt  -e 's/abc/789/' 2.txt 

改配置文件

调用变量来改文件
[root@localhost selinux]#name=root
[root@localhost selinux]#sed -nr '/$name/p' /etc/passwd
#使用双引号
[root@localhost selinux]#sed -nr "/$name/p" /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@localhost selinux]#sed -nr '/'$name'/p' /etc/passwd
#变量上家上单引号
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

二 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完全兼容

GNU AWK 用户手册文档

https://www.gnu.org/software/gawk/manual/gawk.html

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

在 Linux/UNIX 系统中,awk 是一个功能强大的编辑工具,逐行读取输入文本,默认以空格或tab键作为分隔符作为分隔,并按模式或者条件执行编辑命令。而awk比较倾向于将一行分成多个字段然后进行处理。AWK信息的读入也是逐行

指定的匹配模式进行查找,对符合条件的内容进行格式化输出或者过滤处理,可以在无交互

的情况下实现相当复杂的文本操作,被广泛应用于 Shell 脚本,完成各种自动化配置任务。

工作原理:

前面提到 sed 命令常用于一整行的处理,而 awk 比较倾向于将一行分成多个“字段”然后再进行处理,且默认情况下字段的分隔符为空格或 tab 键。awk 执行结果可以通过 print 的功能将字段数据打印显示。

格式:

awk [选项] ‘模式条件{操作}’ 文件1 文件2....
awk -f|-v 脚本文件 文件1 文件2.....



模式:
未指定表示 为空

/1/2/代表正则表达式

关系表达式
2.1基础用法
[root@localhost ~]#awk ''
#空没有效果

[root@localhost ~]#awk '{print}' 
##在打印一遍
dd
dd


[root@localhost ~]#awk '{print "hello"}' 
#字符串需要添加双引号,单引号已被使用
1
hello
1
hello
[root@localhost ky15]#awk 'BEGIN {print "hello"}'
#BEGIN比较特殊值打一行
hello



[root@localhost ~]#awk '{print 100}' 
#数字不需要
1
100
[root@localhost ~]#awk -F: '{print "root"}' /etc/passwd
#打印root 多少行=passwd里的行数
[root@localhost ky15]#echo {a..b} |awk '{print $1}'
#连续的空白符也可以
a
[root@localhost ky15]#df|awk '{print $5}'
#分区利用率
已用%
8%
0%
0%
1%
0%
4%
0%
1%
[root@localhost ky15]#cat /etc/passwd|awk -F: '{print $1,$3}'
#指定冒号作为分隔符,打印第一列和第三列
[root@localhost ky15]#cat /etc/passwd|awk -F: '{print $1":"$3}'
#用冒号分隔开
[root@localhost ky15]#cat /etc/passwd|awk -F: '{print $1"\t"$3}'

[root@localhost ~]#df|awk -F"( +|%)" '{print $5}'
[root@localhost ky15]#df |awk -F"[[:space:]]+|%" '{print $5}'
[root@localhost ky15]#df |awk -F"[ %]+" '{print $5}'

取 ip地址

[root@localhost ky15]#ifconfig ens33|sed -n '2p' |awk '{print $2}'

[root@localhost ky15]#hostname -I|awk {print $1}
192.168.91.100 192.168.122.1 












[root@localhost ~]#wc -l /etc/passwd
45 /etc/passwd
[root@localhost ~]#awk -F: '{print $0}' /etc/passwd
#$0代表全部元素
[root@localhost ~]#awk -F: '{print $1}' /etc/passwd
#代表第一列
[root@localhost ~]#awk -F: '{print $1,$3}' /etc/passwd
#代表第一第三列
[root@localhost ky15]#awk '/^root/{print}' passwd 
#已root为开头的行
[root@localhost ky15]#grep -c "/bin/bash$" passwd 
#统计当前已/bin/bash结尾的行
2
#####  BEGIN{}模式表示,在处理指定的文本前,需要先执行BEGIN模式中的指定动作; awk再处理指定的文本,之后再执行END模式中的指定动作,END{}语句中,一般会放入打印结果等语句。




[root@localhost ky15]#awk 'BEGIN {x=0};/\/bin\/bash$/;{x++};END{print x}' passwd 
## 先定义变量
[root@localhost ky15]#awk 'BEGIN {x=0};/\/bin\/bash$/ {x++;print x,$0};END{print x}' passwd
###
2.2awk 常见的内置变量
  • FS :指定每行文本的字段分隔符,缺省为空格或制表位。与 “-F”作用相同 -v “FS=:”
  • NF:当前处理的行的字段个数
  • NR:当前处理的行的行号(序数)
  • $0:当前处理的行的整行内容
  • $n:当前处理行的第n个字段(第n列)
  • FILENAME:被处理的文件名
  • RS:行分隔符。awk从文件上读取资料时,将根据RS的定义就把资料切割成许多条记录,而awk一次仅读入一条记录进行处理。预设值是\n
FS
[root@localhost ky15]#awk -v FS=: '{print $1FS$3}' /etc/passwd
#此处FS 相当于于变量
[root@localhost ky15]#awk -F: '{print $1":"$3}' /etc/passwd

shell中的变量
[root@localhost ky15]#fs=":";awk -v FS=$fs '{print $1FS$3}' /etc/passwd
#定义变量传给FS
OFS
[root@localhost ky15]#fs=":";awk -v FS=$fs -v OFS="+" '{print $1,$3}' /etc/passwd
#输出分隔符


NF
[root@localhost ky15]#awk -F: '{print NF}' /etc/passwd

[root@localhost ky15]#awk -F: '{print $NF}' /etc/passwd
#最后一个字段

[root@localhost ky15]#df|awk -F: '{print $(NF-1)}'
#倒数第二行
[root@localhost ky15]#df|awk -F "[ %]+" '{print $(NF-1)}'


NR
[root@localhost ky15]#awk '{print $1,NR}' /etc/passwd
##行号
[root@localhost ky15]#awk 'NR==2{print $1}' /etc/passwd
#只取第二行的第一个字段
[root@localhost ky15]#awk 'NR==1,NR==3{print}' passwd 
#打印出1到3 行
[root@localhost ky15]#awk 'NR==1||NR==3{print}' passwd
#打印出1和3行
[root@localhost ky15]#awk '(NR%2)==0{print NR}' passwd
#打印出函数取余数为0行
[root@localhost ky15]#awk '(NR%2)==1{print NR}' passwd
#打印出函数取余数为1的行
[root@localhost ky15]#awk 'NR>=3 && NR<=6{print NR,$0}' /etc/passwd

[root@localhost ky15]#seq 10|awk 'NR>5 && NR<10'
#取 行间
6
7
8
9
[root@localhost ky15]#awk '$3>1000{print}' /etc/passwd
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值