SHELL脚本-文本三剑客

SHELL脚本-文本三剑客

grep

常用选项

选项描述补充
-E扩展正则(ERE)–extended–regexp
-P内置正则Perl
-i忽略大小写–ignore–case
-n打印行号–line–number
-o只打印匹配的内容–only–matching
-c只打印每个文件匹配的行数–count
-B打印匹配的前几行–before–context=NUM
-A打印匹配的后几行–after–context=NUM
-C打印匹配的前后几行–context=NUM
–color=auto高亮显示匹配内容默认设定
-v取反,打印不匹配的行–invert–match
-e多点操作

结合正则表达式使用

基础正则
符号描述备注
.匹配任意单个字符(必须存在)
^匹配以某个字符开头的行
$配以什么字符结尾的行
^$匹配空行
*匹配前面的一个字符出现0次或者多次
.*表示任意长度的任意字符
[list]匹配list中的任意单个字符
[ ^list]匹配除list中的任意单个字符
^[list]匹配以list中的任意单个字符开头的
^[ ^list]匹配除list中的任意单个字符开头的
<以什么开头符号中有\
>以什么结尾符号中有\
<>精确匹配符号中有\
{n}匹配前面的字符连续出现n次符号中有\
{n,}匹配前面的字符至少出现n次符号中有\
{m,n}表示匹配前面的字符出现至少m次,至多n次符号中有\
(strings)保存被匹配的字符,后面可以用标签\1代替符号中有\
Perl内置正则(-P)
符号描述备注
\d匹配数字[0-9]
\w匹配字母数字下划线[a-zA-Z0-9_]
\s匹配空格、制表符、换页符[\t\r\n]
扩展正则表达式(-E)
符号描述备注
+匹配一个或多个前面的字符
?匹配零个或一个前面的字符
|
()组字符(taobao|baidui).com
{n}前导字符重复n次符号中没有\
{n,}前导字符重复至少n次符号中没有\
{n,m}前导字符重复n到m次符号中没有\
案例:查看配置文件时去除所有的注释和空行
[root@server1 ~]# grep -Ev "^#|^$" /etc/ssh/sshd_config 
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_ecdsa_key
HostKey /etc/ssh/ssh_host_ed25519_key
SyslogFacility AUTHPRIV
AuthorizedKeysFile	.ssh/authorized_keys
PasswordAuthentication yes
ChallengeResponseAuthentication no
GSSAPIAuthentication yes
GSSAPICleanupCredentials no
UsePAM yes
X11Forwarding yes
AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE
AcceptEnv XMODIFIERS
Subsystem	sftp	/usr/libexec/openssh/sftp-server

sed

概述

  • 可以非交互编辑文件,常用于shell脚本中
  • sed把当前正在处理的行保存在一个临时缓存区中(也称为模式空间),然后处理临时缓冲区中的行,不会直接修改原文件(如果想修改原文件,加上相应的参数即可),完成后把处理后的行发送到屏幕上。

语法

命令行使用
sed [option]  '地址定位|sed的命令' filename

常用选项
-e	进行多项编辑
-n	取消默认的输出
-f	指定sed脚本的文件名
-r  使用扩展正则表达式
-i	修改源文件

常用命令
p	打印行
d	删除行
i	在当前行的上一行插入
$i	在最后一行的上一行插入
a	在当前行的下一行插入
$a	在最后一行的下一行插入(追加)
c	替换整行内容
r	读取
w	另存为
!	取反
s	查找替换
g	替换全行
&	替换串中引用查找串内容
=	打印行号
[root@server1 ~]# head -5 /etc/passwd > test.txt

打印文件
[root@server1 ~]# sed 'p' test.txt 
root:x:0:0:root:/root:/bin/bash
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@server1 ~]# sed -n 'p' test.txt #取消默认输出
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

打印1-3行
[root@server1 ~]# sed -n '1,3p' test.txt  
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

删除行
[root@server1 ~]# sed  '1d' test.txt  
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
[root@server1 ~]# sed -n '1d' test.txt  #取消默认输出

单行插入
[root@server1 ~]# sed  '1ihello' test.txt 
hello
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

多行插入
[root@server1 ~]# sed  '1ihello\nworld' test.txt 
hello
world
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
[root@server1 ~]# sed  '1ihello\
> linux\
> world' test.txt
#通过换行符,多行插入

追加
[root@server1 ~]# sed  '$ahello' test.txt 
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
hello

替换
[root@server1 ~]# sed  '1chello world' test.txt 
hello world
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

匹配替换
#匹配语法:/匹配的内容/
[root@server1 ~]# sed  '/bin/chello' test.txt #查找含bin的行,替换为hello
hello
hello
hello
hello
hello

读取
[root@server1 ~]# sed  '$r /etc/hosts' test.txt 
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
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.226.40 admin 
192.168.226.10 node1 
192.168.226.20 node2 
192.168.226.30 node3 

另存为
[root@server1 ~]# sed '1,3w 111' test.txt 
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
[root@server1 ~]# cat 111 
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@server1 ~]# sed -n  '/root/w 111' test.txt #将含有root的行另存到111中
[root@server1 ~]# cat 111 
root:x:0:0:root:/root:/bin/bash

取反
[root@server1 ~]# sed -n  '1,3!p' test.txt 
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

查找替换
[root@server1 ~]# sed -n  's/root/ROOT/p' test.txt #默认替换第一个
ROOT:x:0:0:root:/root:/bin/bash
[root@server1 ~]# sed -n  's/root/ROOT/gp' test.txt #替换全行
ROOT:x:0:0:ROOT:/ROOT:/bin/bash

自定义分隔符(一般用于查找或替换的内容种含有/分隔符时)
[root@server1 ~]# sed -n  's#/sbin/nologin#/bin/bash#gp' test.txt 
bin:x:1:1:bin:/bin:/bin/bash
daemon:x:2:2:daemon:/sbin:/bin/bash
adm:x:3:4:adm:/var/adm:/bin/bash
lp:x:4:7:lp:/var/spool/lpd:/bin/bash

批量注释
[root@server1 ~]# sed -n  '1,3s/^/#/p' test.txt 
#root:x:0:0:root:/root:/bin/bash
#bin:x:1:1:bin:/bin:/sbin/nologin
#daemon:x:2:2:daemon:/sbin:/sbin/nologin

去掉文件中所有特殊字符
[root@server1 ~]# sed -n  '1,3s/[/:]//gp' test.txt 
rootx00rootrootbinbash
binx11binbinsbinnologin
daemonx22daemonsbinsbinnologin

保存查找串以便在替换串中引用
[root@server1 ~]# sed -n  '1,3s/\(root\)/\1 hello/gp' test.txt 
root hello:x:0:0:root hello:/root hello:/bin/bash
[root@server1 ~]# sed -n  '1,3s/root/& hello/gp' test.txt 
root hello:x:0:0:root hello:/root hello:/bin/bash

打印行号
[root@server1 ~]# sed -n '/bash$/= ' test.txt 
1

多项编辑
[root@server1 ~]# sed -ne '/bash$/= ' -ne '/bash$/p' test.txt 
1
root:x:0:0:root:/root:/bin/bash

修改原文件
#不能加-n选项,会清空文件
#不能加p命令,文件会多出打印的行
[root@server1 ~]# sed -i 's/root/ROOT/g' test.txt 
[root@server1 ~]# cat test.txt 
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
选项/命令说明用法
-n取消默认输出
-e进行多项编辑sed -ne ‘/nologin$/=’ -ne ‘/nologin$​/p’ 1.txt
-f指定文件名可不加
-r扩展正则
-i修改源文件不能同-i选项和p命令一起使用
p打印行sed -n ‘1,5p’ a.txt
d删除行sed -n ‘1d’ a.txt
i在当前行的上一行插入sed ‘1ihello\nworld’ test.txt
$i在最后一行的上一行插入
a在当前行的下一行插入sed ‘5ahello’ a.txt
$a追加
c替换整行内容sed ‘1,5chello world’ a.txt
r读取sed ‘3r /etc/hosts’ 2.txt
w另存为sed ‘/root/w a.txt’ 2.txt
!取反sed -n ‘1!p’ 1.txt
s查找替换sed -n ‘s/root/ROOT/p’ 1.txt
g替换全行sed -n ‘s/root/ROOT/gp’ 1.txt
&替换串中引用查找串内容sed -n ‘s/root/#&/p’ a.txt
=打印行号sed -n ‘/bash$/=’ 1.txt
案例
  • 查看配置文件时去除所有的注释和空行
方法1
[root@server1 ~]# sed -e '/^#/d' -e '/^$/d' /etc/ssh/sshd_config 
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_ecdsa_key
HostKey /etc/ssh/ssh_host_ed25519_key
SyslogFacility AUTHPRIV
AuthorizedKeysFile	.ssh/authorized_keys
PasswordAuthentication yes
ChallengeResponseAuthentication no
GSSAPIAuthentication yes
GSSAPICleanupCredentials no
UsePAM yes
X11Forwarding yes
AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE
AcceptEnv XMODIFIERS
Subsystem	sftp	/usr/libexec/openssh/sftp-server

方法2
[root@server1 ~]# sed '/^#/d;/^$/d' /etc/ssh/sshd_config 
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_ecdsa_key
HostKey /etc/ssh/ssh_host_ed25519_key
SyslogFacility AUTHPRIV
AuthorizedKeysFile	.ssh/authorized_keys
PasswordAuthentication yes
ChallengeResponseAuthentication no
GSSAPIAuthentication yes
GSSAPICleanupCredentials no
UsePAM yes
X11Forwarding yes
AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE
AcceptEnv XMODIFIERS
Subsystem	sftp	/usr/libexec/openssh/sftp-server

方法3
[root@server1 ~]# sed -r '/^#|^$/d' /etc/ssh/sshd_config 
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_ecdsa_key
HostKey /etc/ssh/ssh_host_ed25519_key
SyslogFacility AUTHPRIV
AuthorizedKeysFile	.ssh/authorized_keys
PasswordAuthentication yes
ChallengeResponseAuthentication no
GSSAPIAuthentication yes
GSSAPICleanupCredentials no
UsePAM yes
X11Forwarding yes
AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE
AcceptEnv XMODIFIERS
Subsystem	sftp	/usr/libexec/openssh/sftp-server
  • 获取IP地址
方法1
[root@server1 ~]# ifconfig ens33 |sed '2!d'
        inet 192.168.226.10  netmask 255.255.255.0  broadcast 192.168.226.255
[root@server1 ~]# ifconfig ens33 |sed '2!d'|cut -d' ' -f10,13,16
192.168.226.10 255.255.255.0 192.168.226.255

方法2
[root@server1 ~]# ifconfig ens33 |sed '2!d'|sed -n 's/ /\n/gp'|sed '/^$|[a-z]/d'

inet
192.168.226.10

netmask
255.255.255.0

broadcast
192.168.226.255
[root@server1 ~]# ifconfig ens33 |sed '2!d'|sed -n 's/ /\n/gp'|sed -r '/^$|[a-z]/d'
192.168.226.10
255.255.255.0
192.168.226.255
脚本中使用
  • 编写sed脚本时,需添加其相应的魔法字符(命令解释器)
  • 只需要写’······'之间的内容
  • 一行一条命令
  • 命令后注意不能有空格
[root@server1 ~]# vim sed.sh
#!/bin/sed -f
1,3d
s/root/hello/g
2iworld
[root@server1 ~]# cat test.txt 
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
[root@server1 ~]# sed -f sed.sh test.txt 
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

[root@server1 ~]# sed -f sed.sh -i test.txt #修改原文件
[root@server1 ~]# cat test.txt 
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

awk

概述

  • awk是一种编程语言,awk语言的最基本功能是在文件或者字符串中基于指定规则浏览和抽取信息,awk抽取信息后,才能进行其他文本操作。
  • 完整的awk脚本通常用来格式化文本文件中的信息。
  • 通常,awk是以文件的为处理单位的。awk每接收文件的一行,然后执行相应的命令,来处理文本
  • awk分别代表其三个作者姓氏的第一个字母,分别是Alfred Aho、Brian Kernighan、Peter Weinberger。
  • gawk是awk的开源版本,在linux系统中已把awk链接到gawk。
[root@server1 ~]# ll /bin/awk
lrwxrwxrwx. 1 root root 4 7月  24 17:32 /bin/awk -> gawk

命令模式使用

语法
awk 选项 '正则,地址地位{awk语句}' 文件名

常用选项
-F	指定分隔符,可指定一个或多个,默认的分隔符是空格
-v	定义变量并赋值
  • ’command’ 里面书写规范

    正则匹配
    '/^root/{awk语句}' #匹配root开头
    [root@server1 ~]# cat test.txt 
    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
    [root@server1 ~]# awk -F: '/^root/{print $0}' test.txt 
    root:x:0:0:root:/root:/bin/bash
    
    地址定位
    'NR==1,NR==5{awk语句}' #匹配1-5行
    [root@server1 ~]# awk -F: 'NR==3{print $0}' test.txt 
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    
    多条awk语句用;分隔
    [root@server1 ~]# awk -F: 'NR==3{print $1,$3}' test.txt 
    daemon 2
    [root@server1 ~]# awk -F: 'NR==3{print $1;print $3}' test.txt 
    daemon
    2
    
    BEGIN END使用
    'BEGIN{awk语句};{处理中};END{awk语句}'
    'BEGIN{awk语句};{处理中}'
    '{处理中};END{awk语句}'
    [root@server1 ~]# awk -F: 'BEGIN{print "Login_shell\tLogin_home\n********"};{print $NF"\t\t"$(NF-1)};END{print "***********"}' /etc/passwd
    Login_shell	Login_home
    ********
    /bin/bash		/root
    /sbin/nologin		/bin
    /sbin/nologin		/sbin
    /sbin/nologin		/var/adm
    /sbin/nologin		/var/spool/lpd
    /bin/sync		/sbin
    /sbin/shutdown		/sbin
    /sbin/halt		/sbin
    /sbin/nologin		/var/spool/mail
    /sbin/nologin		/root
    /sbin/nologin		/usr/games
    /sbin/nologin		/var/ftp
    /sbin/nologin		/
    /sbin/nologin		/
    /sbin/nologin		/
    /sbin/nologin		/
    /sbin/nologin		/var/empty/sshd
    /sbin/nologin		/var/spool/postfix
    /sbin/nologin		/usr/share/httpd
    /sbin/nologin		/dev/null
    /sbin/nologin		/var/lib/zabbix
    /bin/bash		/home/cephu
    /sbin/nologin		/etc/ntp
    ***********
    
内部变量
变量变量说明备注
$0当前处理行的所有记录
$1,$2,$3…$n文件中每行以间隔符号分割的不同字段‘{print $1,$3}’
NF当前记录的字段数(列数)‘{print NF}’
$NF最后一列$(NF-1)表示倒数第二列
NR行号‘NR==2{print $7}’
FNR行号(用法同上)
FS定义输入字段分隔符,默认空格‘BEGIN{FS=":"};{print $1,$3}’
OFS定义输出字段分隔符,默认空格‘BEGIN{OFS="\t"};print $1,$3}’
RS定义输入记录分割符,默认换行‘BEGIN{RS="\t"};{print $0}’
ORS定义输出记录分割符,默认换行‘BEGIN{ORS="\n\n"};{print $1,$3}’
FILENAME当前输入的文件名
定义输入分隔符
#方法一:选项-F指定
[root@server1 ~]# awk -F: '{print $1,$NF}' test.txt 
root /bin/bash
bin /sbin/nologin
daemon /sbin/nologin
adm /sbin/nologin
lp /sbin/nologin
#方法二:借助内部变量FS
[root@server1 ~]# awk 'BEGIN{FS=":"};{print $1,$NF}' test.txt 
root /bin/bash
bin /sbin/nologin
daemon /sbin/nologin
adm /sbin/nologin
lp /sbin/nologin

定义输出分隔符
#默认
[root@server1 ~]# awk -F: '{print $1,$NF}' test.txt
root /bin/bash
bin /sbin/nologin
daemon /sbin/nologin
adm /sbin/nologin
lp /sbin/nologin
#方法一:字段间通过写在“ ”间指定
[root@server1 ~]# awk -F: '{print $1"\t"$NF}' test.txt 
root	/bin/bash
bin	/sbin/nologin
daemon	/sbin/nologin
adm	/sbin/nologin
lp	/sbin/nologin
#方法二:借助内部变量OFS
[root@server1 ~]# awk -F: 'BEGIN{OFS="\t"};{print $1,$NF}' test.txt 
root	/bin/bash
bin	/sbin/nologin
daemon	/sbin/nologin
adm	/sbin/nologin
lp	/sbin/nologin

定义输入记录分隔符
[root@server1 ~]# vim 1.txt
  1 123^I456^I789$
  2 234 567$
  3 sdvffrrvf$
  4 ddfd sdg^Ifhh^Idd$
[root@server1 ~]# awk 'BEGIN{RS="\t"};{print $0}' 1.txt  #默认换行符依旧生效
123
456
789
234 567
sdvffrrvf
ddfd sdg
fhh
dd

定义输出记录分割符
[root@server1 ~]# awk '{print $0}' 1.txt #默认
123	456	789
234 567
sdvffrrvf
ddfd sdg	fhh	dd
[root@server1 ~]# awk 'BEGIN{ORS="\t"};{print $0}' 1.txt
123	456	789	234 567	sdvffrrvf	ddfd sdg	fhh	dd	[root@server1 ~]# 

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lQBGTnRM-1632147942425)(…/%E5%9B%BE%E7%89%87%E6%94%BE%E7%BD%AE%E7%82%B9/image-20210918154138794.png)]

工作流程

awk -F: '{print $1,$NF}' /etc/passwd为例

  • awk使用一行作为输入,并将这一行赋给内部变量$0,每一行就是一个记录,以换行符(RS)结束
  • 每行被间隔符冒号(FS)分解成字段,每个字段存储在已编号的变量中,从$1开始,到$NF结束
  • awk使用print函数打印字段,打印出来的字段会以空格分隔,因为$1,$NF之间有一个逗号。逗号比较特殊,它映射为另一个内部变量OFS,OFS默认为空格
  • awk处理完一行后,将从文件中获取另一行,并将其存储在$0中,覆盖原来的内容,然后将新的字符串分隔成字段并进行处理。该过程将持续到所有行处理完毕
结合正则使用
运算符说明
==等于
!=不等于
>大于
<小于
>=大于等于
<=小于等于
~匹配
!~不匹配
!逻辑非
&&逻辑与
||逻辑或
从以lp开头的行匹配到第10行  
[root@server1 ~]# awk '/^lp/,NR==10{print $0}' /etc/passwd
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

打印6-10行
[root@server1 ~]# awk 'NR>=6 && NR<=10{print $0}' /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
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin

打印6-10行,以nologin结尾的行
[root@server1 ~]# awk 'NR>=6 && NR<=10 && /nologin$/{print $0}' /etc/passwd
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
格式化输出printf
%s	字符类型
%d	数值类型
-	表示左对齐,不加默认右对齐
\n	换行,printf默认行尾不换行
[root@server1 ~]# awk -F: '{printf "%-15s %-20s\n", $NF,$(NF-1)}' /etc/passwd
/bin/bash       /root               
/sbin/nologin   /bin                
/sbin/nologin   /sbin               
/sbin/nologin   /var/adm            
/sbin/nologin   /var/spool/lpd      
/bin/sync       /sbin               
/sbin/shutdown  /sbin               
/sbin/halt      /sbin               
/sbin/nologin   /var/spool/mail     
/sbin/nologin   /root               
/sbin/nologin   /usr/games          
/sbin/nologin   /var/ftp            
/sbin/nologin   /                   
/sbin/nologin   /                   
/sbin/nologin   /                   
/sbin/nologin   /                   
/sbin/nologin   /var/empty/sshd     
/sbin/nologin   /var/spool/postfix  
/sbin/nologin   /usr/share/httpd    
/sbin/nologin   /dev/null           
/sbin/nologin   /var/lib/zabbix     
/bin/bash       /home/cephu         
/sbin/nologin   /etc/ntp            

脚本编程

脚本执行
[root@server1 ~]# vim awk.sh
#!/bin/awk -f

#编写' '内的内容即可
BEGIN{FS=":"}
NR==1,NR==3{print $1"\t"$NF}

[root@server1 ~]# awk -f awk.sh /etc/passwd
root	/bin/bash
bin	/sbin/nologin
daemon	/sbin/nologin
定义变量
[root@server1 ~]# awk -v num=1 '{print num}' 1.txt 
1
1
1
1
[root@server1 ~]# awk -v num=1 'BEGIN{print num}'
1
选择执行
awk 选项 '正则,地址定位{if(条件){语句1;语句2;...}}' 文件名
awk 选项 '正则,地址定位{if(条件){语句1;语句2;...} else{语句1;语句2;...}}' 文件名
awk 选项 '正则,地址定位{if(条件1){语句1;语句2;...} else if(条件2){语句1;语句2;...} else{语句1;语句2;...}}' 文件名

案例:打印普通用户的UID和用户名
[root@server1 ~]# awk -F: '{if($3>=1000){print $1,$3}}' /etc/passwd
cephu 1000
zhnagsan 1001
lisi 1002
[root@server1 ~]# awk -F: '{if($3>=1000){print $1"\t"$3}else{print $1"\t非普通用户"}}' /etc/passwd
root	非普通用户
bin		非普通用户
daemon	非普通用户
adm		非普通用户
lp		非普通用户
sync	非普通用户
shutdown非普通用户
halt	非普通用户
mail	非普通用户
operator非普通用户
games	非普通用户
ftp		非普通用户
nobody	非普通用户
systemd-network	非普通用户
dbus	非普通用户
polkitd	非普通用户
sshd	非普通用户
postfix	非普通用户
apache	非普通用户
tss		非普通用户
zabbix	非普通用户
cephu	1000
zhnagsan	1001
lisi	1002
[root@server1 ~]# awk -F: '{if($3>=1000){print $1"\t普通用户"} else if($3==0){print $1"\t管理员"} else{print $1"\t系统用户"}}' /etc/passwd
root	管理员
bin		系统用户
daemon	系统用户
adm		系统用户
lp		系统用户
sync	系统用户
shutdown系统用户
halt	系统用户
mail	系统用户
operator系统用户
games	系统用户
ftp		系统用户
nobody	系统用户
systemd-network	系统用户
dbus	系统用户
polkitd	系统用户
sshd	系统用户
postfix	系统用户
apache	系统用户
tss		系统用户
zabbix	系统用户
cephu	普通用户
ntp		系统用户
zhnagsan普通用户
[root@server1 ~]# awk -F: '{if($3>=1000){i++} else if($3==0){j++} else{k++}};END{print j"个管理员\n"k" 个系统用户\n"i"个普通用户"}' /etc/passwd
1个管理员
21个系统用户
3个普通用户
循环语句
打印1,3,5,7,9
[root@server1 ~]# awk 'BEGIN{for(i=1;i<=10;i+=2){print i}}'
1
3
5
7
9
[root@server1 ~]# awk 'BEGIN{i=1;while(i<=10){print i;i+=2}}'
1
3
5
7
9
算数运算
可以进行小数运算
+ - * / %() **()都可以运算
[root@server1 ~]# awk 'BEGIN{print 2**3}'
8
[root@server1 ~]# awk 'BEGIN{print 2/3}'
0.666667
案例
打印ip地址
[root@server1 ~]# ifconfig ens33 |awk 'NR==2{print $2}'
192.168.226.10
[root@server1 ~]# ifconfig ens33 |awk 'NR==2{print $2"\n"$4"\n"$6}'
192.168.226.10
255.255.255.0
192.168.226.255

统计/etc/passwd 中各种类型shell的数量
[root@server1 ~]# awk -F: '{shells[$NF]++};END{for(i in shells){print i,shells[i]}}' /etc/passwd
/bin/sync 1
/bin/bash 4
/sbin/nologin 18
/sbin/halt 1
/sbin/shutdown 1
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值