grep命令
常用的文本过滤工具,命令格式:
grep '查找内容' 文件路径 或使用管道 命令 | grep '查找内容'
常用的选项
grep --color=auto 对匹配到信息着色显示,系统默认命令别名定义 grep -m # 表示匹配前#次后停止匹配 gerp -B # 表示过滤的信息和过滤信息前#行信息一起过滤输出 grep -A # 表示过滤的信息和过滤信息后#行信息一起过滤输出 grep -C # 表示过滤的信息和过滤信息前后#行信息一起过滤输出 grep -i 表示忽略过滤信息的大小写 grep -o 表示只显示匹配到内容 grep -n 表示过滤信息显示输出行号 grep -c 小写字母c表示统计过滤信息的次数 grep -v 表示对过滤信息进行取反显示 grep -e 表示多个条件过滤文件, grep -e 'nginx' -e 'php' grep -E 等价于egrep命令,识别扩展正则表达式 grep -q 静默模式,不输出任何信息(可以通过echo ?判断是否匹配到) grep -w 匹配整个单词,相当于\<xxxxx\> grep -F 不支持正则表达式,相当于fgrep grep -f file 把过滤条件写入文件中,文件中不需要写引号 grep -r 递归目录,但不处理软链接文件 grep -R 递归目录,但处理软链接文件
正则表达式
什么是正则表达式
正则表达式是一种用于匹配和操作文本的强大工具,它是由一系列字符和特殊字符组成的模式,用于描述要匹配的文本模式。
正则表达式可以在文本中查找、替换、提取和验证特定的模式。
元字符
一种特殊的字符,用于匹配符合特定规则的文字
. 匹配任意单个字符 \w 任意字母数字或下划线 [] 匹配指定范围内的任意单个字符,示例:[ab][0-9][a-z][a-zA-Z] [^] 匹配指定范围外的任意单个字符,示例:[^ab] [0-9] 匹配数字范围 [a-z] 匹配a-z小写字母 [A-z] 匹配A-Z大写字母 [abc] 匹配列表中的任何的一个字符 [^demo] 匹配列表中的所有字符以外的字符 [[:digit:]] 匹配任意数字,相当于0-9 [[:lower:]] 匹配任意小写字母,表示a-z [[:upper:]] 匹配任意大写字母,表示A-Z [[:alpha:]] 匹配任意大小写字母 [[:a1num:]] 匹配任意数字或字母 [[:blank:]] 匹配水平空白字符 [[:space:]] 匹配水平或垂直空白字符 [[:punct:]] 匹配标点符号 [[:print:]] 匹配可打印字符 [[:cntr1:]] 匹配控制(非打印)字符 [[:graph:]] 匹配图形字符 [[:xdigit:]] 匹配十六进制字符
位置匹配
用于定义文字出现的位置
^ 行首锚定,用于模式的最左侧 $ 行尾锚定,用于模式的最右侧 \<PATTERN\> 匹配整个单词
次数匹配
匹配文字或词组出现的次数
* #匹配前面的字符任意次,包括0次,贪婪模式:尽可能长的匹配 .* #任意长度的任意字符 \? #匹配其前面的字符出现0次或1次,即:可有可无 \+ #匹配其前面的字符出现最少1次,即:肯定有且 >=1 次 \{n\} #匹配前面的字符n次 \{m,n\} #匹配前面的字符至少m次,至多n次 \{,n\} #匹配前面的字符至多n次,<=n \{n,\} #匹配前面的字符至少n次
分组
小括号将多个字符组合到一起,作为整体匹配
(root)+ 匹配root出现一次以上 (root|hello){2} 匹配出现2个root或hello
sed 命令
sed是一种文本流编辑工具,可以一行一行的处理文件内容
工作原理
Sed是从文件或管道中读取一行,处理一行,输出一行,直到最后一行。每当处理一行时,把当前处理的行存储在临时缓冲区中,称为模式空间(Pattern Space)。
接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。一次处理一行的设计模式使得sed性能很高,sed在读取大文件时不会出现卡顿的现象。
基本语法
sed可以对文字进行增删改查
基本语法
sed 选项 "处理命令" 文件
常用选项
选项 | 描述 |
---|---|
-n | 关闭sed默认输出功能,只输出script处理过的信息 |
-e | 指定多个script指令,多点匹配 |
-f | 从指定文件读取script指令 |
-r | 识别扩展正则表达式 |
-i<备份后缀> | sed默认处理数据不影响文件原内容,-i 参数编辑文件并备份原文件,如:-i.bak |
处理命令
指令 | 描述 |
---|---|
p | 输出script处理的数据行 |
Ip | I 参数忽略过滤信息大小写 |
d | 删除模式匹配的行 |
a\ | 模式匹配的行后面追加内容信息,并处理下一行 |
i\ | 模式匹配的行前面追加内容信息,并处理下一行 |
c\ | 替换指定整行信息 |
w file | 保存模式匹配的行至指定文件 |
r file | 读取指定文件的文本至模式空间中匹配到的行后 |
= | 显示匹配到信息所在行号 |
! | 取反 |
; | 同参数 -e |
搜索替换格式:s/正则表达式/替换内容/修饰符
修饰符 | 描述 |
---|---|
无修饰符 | 表示只替换每一行第一个匹配到的文本 |
g | 表示行内全面替换,不输出文本,Ng表示替换匹配到的前N行 |
p | 表示打印替换后文本 |
w | 表示被替换信息写入一个文件 |
I / i | 替换忽略字母大小写 |
处理地址
处理地址 | 描述 |
---|---|
无地址 | 对文件全文处理 |
n | 指定第几行处理 |
$ | 处理文件最后一行 |
/regexp/ | 正则匹配,匹配到的文本处理。加上 -r 参数,支持扩展正则表达式 |
n,m | 范围匹配,指定从n行到m行文本处理 |
n,+m | 范围匹配,指定从n行到n+m行文本处理 |
/regexp1/ , /regexp2/ | 范围匹配,指定从regexp1匹配到行到regexp2匹配到行处理 |
n,/regexp/ | 范围匹配,指定从n行到regexp匹配到行处理 |
n~m | 步长匹配,1~2 表示从第一行过滤奇数行,2~2表示过滤偶数行 |
基本操作
文字打印
1)把文件全文内容输出俩遍
sed "p" /etc/passwd
2)只打印输出处理的数据文本行
sed -n "p" /etc/passwd
匹配地址
输出/etc/passwd文件的第10行
sed -n "10p" /etc/passwd
打印文件的最后一行文本
sed -n "$p" /etc/passwd
打印第一到第五行信息
sed -n '1,5p' /etc/passwd
尝试着做做练习!
练习:打印第一行到最后一行信息
练习:打印第五行后面三行信息
打印奇数行
seq 10|sed -n '1~2p'
练习:求100以内的偶数和
seq 100|sed -n '0~2p'| awk '{s+=$1} END {print s}'
正则表达式
匹配字母d开头的行到字母n结尾的行,打印俩行之间文本
sed -n '/^d/,/n$/p' /etc/passwd
打印第三行到字母m开头的行
sed -n '3,/^m/p' /etc/passwd
匹配字母b开头的行到字母s开头的行
sed -n '/^b/,/^s/p' /etc/passwd
忽略大小写
sed -n '/ROOT/Ip' /etc/passwd
多点匹配
sed -e 执行多个script进行匹配文件内容,或者关系
打印/etc/passwd文件的第五行和第七行内容
sed -n '5p;7p' /etc/passwd sed -n -e '5p' -e '7p' /etc/passwd
打印root开头行或者以nologin结尾的行
sed -n "/^root/p;/nologin$/p" /etc/passwd sed -n -e "/^root/p" -e '/nologin$/p' /etc/passwd
显示行号
sed -n '/root/=' /etc/passwd
练习1:打印有至少连续2个数字的行
sed -nr '/[0-9]{2}/p' /root/hh.sh
练习2:打印包含负数或小数的行
sed -nr '/(^-[0-9]|.[0-9])/p' /root/hh.sh
练习3:打印本机IP地址
ip a | tr -s " " | sed -nr '/^ inet [0-9].*33$/p' | cut -d " " -f 3
练习4:匹配#注释的行
sed -nr '/^#/p' /root/hh.sh
练习5:匹配html注释的行
sed -nr '/(^<!-- | $-->)/p' /root/hh.sh
练习6:匹配Email
删除操作
删除文件指定行
sed '2d' /etc/passwd
删除文件第二行到第六行
sed '/2,6/d' /etc/passwd
删除以字母d开始的行到以m开头的行,如果只匹配到字母d开头,文件末尾也没有匹配到字母m开头,则删除字母d到文件末尾
sed '/^d/,/^m/d' /etc/passwd
修改文件
删除root的行并保存到xxx.bak文件中 sed -i.bak '/root/d' passwd
练习1:把my.cnf文件端口port前面的注释去掉
练习2:删除my.cnf中[mysqld]和[mysql]之间的内容
追加操作
在/etc/passwd文件的第五行后追加一行信息“this is test append”
sed "5a\this is test append" /etc/passwd
在/etc/passwd文件中以root开头的行追加一行信息“this is test append”
sed -n "/root/a\this is test append" /etc/passwd
seq 15 | sed '5,10a hello'
插入操作
在/etc/passwd文件的第三行前插入信息“this is test insert”
sed '3i\this is test insert' /etc/passwd
在/etc/passwd文件中以root开头的行前插入信息 “this is test insert”
sed '/root/i\this is test insert' /etc/passwd
seq 10 | sed -e '5i\123' -e '5a\456'
替换操作
指令c,表示把匹配到一整行信息替换
把第四行信息替换为“this is test replace”
seq 10 | sed "4c\this is test replace"
正则匹配到的整行替换
seq 10 | sed -r "/[235]/c\this si test replace"
搜索替换
把/etc/passwd文件中的nologin替换为“this is test sub”
sed 's#nologin$#this is test sub#g' /etc/passwd
替换指令 g:表示把文件中匹配到所有字符串进行替换为目标信息
替换指令 p:配合参数 -n ,只打印被替换信息
sed -n 's#nologin$#this is test sub#gp' /etc/passwd
替换指令 w:被替换信息保存到指定文件
sed -n 's#nologin$#this is test sub#gw /data/sub.log' /etc/passwd
练习1:把redis.conf里面的 protectedmode yes 改为 no
sed -i 's#protected-mode yes$#protected-mode no#g' redis.conf
练习2:把redis的端口改为6380
sed -i 's#port 6379$#port 6380#g' redis.conf
练习3:把bind 127.0.0.1前面的注释去掉,将ip改为0.0.0.0
练习4:把daemonize no改为yes
sed -i 's#daemonize no$#daemonize yes#g' redis.conf
练习5:编写shell脚本实现redis一键安装
写入文件
把/etc/passwd文件中以nologin结尾的行写入到/data/nologin.log文件
sed -n '/nologin$/w /data/nologin.log' /etc/passwd
sed -n '/^b/w /data/sed.log' /etc/passwd
sed -n '1w /data/sed.log' /etc/passwd
sed -n '1,5w /data/sed.log' /etc/passwd
注意:指令w 是覆盖原文件内容,写入新内容
读入文件
把/etc/issue文件内容读入到/etc/passwd文件以root开头的行
sed '/^root/r /etc/issue' /etc/passwd
把文件内容读写奇数行
sed '1~2r /etc/issue' /etc/passwd
[root@centos7 ~]#sed '/^b/,/^s/r /etc/issue' /etc/passwd
搜索取反
打印/etc/passwd文件中不是以nologin结尾的行
注意:使用单引号,双引号会把!p认为执行历史命令,建议使用单引号
[root@centos7 ~]#sed -n '/nologin$/!p' /etc/passwd [root@centos7 ~]#sed -n '/root/!p' /etc/passwd
把/etc/fstab文件非注释行添加注释,包括空行
方法一: sed -r '/^#/!s/(.*)/#\1/p' /etc/fstab 方法二: sed -r '/^#/!s/^/#/p' /etc/fstab
引用变量
sed表达式可以使用单引号来引用,但是如果表达式内部包含变量字符串,就需要使用双引号。
test=hello echo hello WORLD | sed "s/$test/HELLO/" HELLO WORLD
AWK命令
awk是什么
awk属于一种脚本语言,由 GUN/Linux 自由软件资金会(FSF)进行开发和维护,通常也叫做 gawk(GNU AWK);用于在Linux平台或者Unix平台下对数据进行处理,数据可以来自标准输入(stdin)、一个或多个文件,或其它命令的输出。
awk和grep,sed命令不同点:grep,sed命令是对数据逐行处理,而awk可以对数据指定分割字符按列处理。此外:awk命令支持自定义变量,算数运行,字符串处理,循坏条件判断,数组以及函数等内置功能。
awk语法
awk 选项 '脚本代码' 文件
选项:
-F 分隔符 如 -F: -F[:.-] -v 变量 如:-v a=10 -f 脚本文件
脚本代码:
模式:{处理动作} 正则匹配模式(默认) 匹配成功后执行处理动作 BEGIN模式 处理数据之前的前置操作 END模式 处理数据之后的后置操作
打印动作
print命令
打印多行文字
seq 10 | awk '{print "Hello"}'
打印指定列
awk -F: '{print $0}' /etc/passwd awk -F: '{print $1$3}' /etc/passwd awk -F: '{print $1,$3}' /etc/passwd awk -F: '{print $1"---"$3}' /etc/passwd awk -F: '{print $1"\t"$3}' /etc/passwd
练习:获得磁盘利用率
printf命令
awk '{printf "格式字符串",$n,$m}'
格式字符串 = 格式符 + 修饰符
格式符 | 作用 |
---|---|
%c | 显示字符的ASCII码 |
%d %i | 显示十进制整数 |
%e %E | 以科学计数法显示 |
%f | 显示浮点数,即:小数 |
%s | 以字符串显示 |
%u | 显示无符号的整数 |
%% | 显示百分号% |
修饰符
m.n m控制显示的宽度(默认右对齐); n对于小数表示小数点后精度, 如:%3.1f; 对于整数表示整数位数,不足则前面补0,如:%.3d - 左对齐宽度, 如:%-15s + 显示数值的正负符号 如:%+d
案例:格式化输出用户名和uid
awk -F: '{printf "username:%-20s userid:%.3d\n",$1,$3}' /etc/passwd
练习:获得磁盘利用率,格式为
文件名:xxx 利用率:xxx
变量
内置变量
内置变量 | 作用 |
---|---|
FS | 设置的分隔符 |
OFS | 输出时的分隔符,默认为空格 |
RS | 定义输入记录的分隔符,默认为换行符 |
ORS | 定义输出记录的分隔符,默认为换行符 |
NF | 按照FS分隔符分割了多少个字段 |
NR | 对每一条记录从1开始进行编 |
FILENAME | 显示当前记录所在文件名 |
ARGC | 命令行参数的个数,在awk命令参数是指:awk命令本身和文件个数 |
ARGV[n] | ARGV数组存放了命令行各个参数,比如:取第一个参数 ARGV[0],取第二个参数 ARGV[1] |
练习:打印passwd倒数第二列
练习:打印passwd第10行
自定义变量
定义变量并输出
awk -v a=10 'BEGIN{print a}' awk 'BEGIN{a=10;print a}'
awk -F: '{title="用户";print $1,title}' /etc/passwd
运算符
算术运算
运算符 | 描述 |
---|---|
a + b | 相加运算 |
a - b | 相减运算 |
a * b | 相乘运算 |
a / b | 相除运算 |
a ^ b 或 a ** b | 次幂运算 |
a % b | 取模运算 |
a++ | 自增 |
a-- | 自减 |
赋值运算
运算符 | 描述 |
---|---|
+= | 加法赋值运算,a += 1 相当于 a = a+1 |
-= | 减法赋值运算,a -= 1 相当于 a = a -1 |
*= | 乘法赋值运算 |
/= | 除法赋值运算 |
^= | 次幂赋值运算 |
%= | 取模赋值运算 |
比较运算
运算符 | 描述 |
---|---|
a == b | 判断a和b是否相等 |
a != b | 判断a和b是否不相等 |
a > b | 判断a是否大于b |
a >= b | 判断a是否大于等于b |
a < b | 判断a是否小于b |
a <= b | 判断a是否小于等于b |
练习:查看/etc/passwd
文件中uid大于1000的数据行
awk -F: '$3 >= 1000' /etc/passwd
练习:打印文件中的奇数行
awk -F: 'NR%2==0' /etc/passwd
逻辑运算
运算符 | 描述 |
---|---|
&& | 逻辑与 |
|| | 逻辑或 |
! | 取反操作 |
练习:查看/etc/passwd
文件中uid 0到999的数据行
awk -F: '$3 < 1000&&$3 > 0' /etc/passwd
查看文件中用户名为ftp 或者sshd的
awk -F: '$1=="ftp"||$1=="sshd"' /etc/passwd
短路功能 前面不成立后面不执行 逻辑于
[root@centos7 ~]#awk 'BEGIN{a=3;b=4;print (a>b) && (++a > b),a,b}' 0 3 4
逻辑或 两个有一个成立就输出
awk -F: '$1=="ftp"||$1=="sshd"' /etc/passwd
三目运算
根据条件判断,执行不同的操作 条件成立执行操作1 否则执行操作2
条件?操作1:操作2
awk 'BEGIN{a=3; print (a%2==0?"偶数":"奇数")}'
那些是虚拟用户那些是系统用户
awk -F: '{a=($3 >= 1000)?"系统用户":"虚拟用户";print $1,a}' /etc/passwd
查找正常用户和虚拟客户 bash 正常客户 其他是虚拟客户
NF是按照FS分隔符分割了多少个字段
然后
awk -F/ '{a=($NF=="bash")?"正常用户":"虚拟用户";print $1,a}' /etc/passwd
awk模式
模式PATTERN:根据条件,过滤匹配的行,再做处理
空模式
空模式:不指定匹配正则信息,打印所有行
awk -F: '{print $1}' /etc/passwd
正则匹配模式
正则匹配模式:根据正则表达式匹配数据行,匹配到数据行进行处理,未能匹配到数据行不做任何处理
awk '/^UUID/' /etc/fstab awk '$0 ~ /^UUID/' /etc/fstab awk '! /^UUID/' /etc/fstab awk '$0 !~ /^UUID/' /etc/fstab
表达式模式
表达式模式:只有表达式结果为真,则处理对应数据行,如果表达式结果为假,则不对数据行做任何处理
-
表达式为真:非0,非空字符串
-
表达式为假:数字0,或者是空字符串
seq 10 | awk '0' seq 10 | awk '1' seq 10 | awk '"aaa"' seq 10 | awk '""'
示例
awk -F: '$3>=1000{print $1,$3}' /etc/passwd awk -F: '$NF=="/bin/bash"{print $1,$NF}' /etc/passwd
行模式
awk不支持直接用行号,但可以使用变量NR间接指定行号进行判断处理
seq 10 | awk 'NR>=3 && NR<=6' awk 'NR>=3 && NR<=6{print NR,$0}' /etc/passwd
awk也支持sed命令的正则范围匹配,匹配一行信息到另一行信息进行处理,比如:匹配以bin开头的行到以sshd开头的行
sed -n '/^bin/,/^sshd/p' /etc/passwd awk '/^bin/,/^sshd/' /etc/passwd awk -F: '/^bin/,/^sshd/{print $1,$3}' /etc/passwd
BEGIN / END 模式
BEGIN模式:仅在开始处理文件中的文本之前执行一次
END模式:仅在文本处理完成之后执行一次
awk -F: 'BEGIN{print "用户","UUID","家目录"};{print $1,$3,$(NF-1)}' /etc/passwd|column -t awk -F: 'BEGIN{print "用户","UUID","家目录"};{print $1,$3,$(NF-1)};END{print "数据处理完毕!"}'/etc/passwd|column -t
示例:awk计算
awk 'BEGIN{print 10/3}' awk -v var=10 'BEGIN{print var/3}
示例:统计/etc/service
文件中的空白行
[root@centos7 ~ ]# egrep "^$" /etc/services|wc -l 17 [root@centos7 ~ ]# awk '/^$/{i=i+1};END{print i}' /etc/services 17
示例:统计/etc/services文件中有井号开头的行
[root@centos7 ~ ]# egrep "^#" /etc/services|wc -l 102 [root@centos7 ~ ]# awk -v i=0 '/^#/{i=i+1};END{print i}' /etc/services 102 [root@centos7 ~ ]# awk '/^#/{i++};END{print i}' /etc/services 102
示例:统计系统中有多少个虚拟用户和普通用户
[root@centos7 ~ ]# awk -F: -v n=0 -v m=0 'BEGIN{printf "%-20s%-s\n","login_user","nologin_user"};/bash$/{n++};!/bash$/{m++};END{printf "%-20s%s\n",n,m}' /etc/passwd login_user nologin_user 2 21
awk -F[:/] '{if($NF=="nologin")next;print $0}' /etc/passwd
awk流程控制
if-else语句
有多个判断条件,有条件成立就执行结束,不成立再判断下一个条件
语法:
if(表达式) {...} if(表达式) {...} else {...} if(表达式) {语句1} else if(表达式) {语句2} else {语句3}
判断奇偶数
awk 'BEGIN{ i = 6; if(i % 2 ==0) {print i"是偶数"} else {print i"是奇数"}}'
判断用户类型
awk -F[:/] '{ if($NF=="bash") {print $1"是普通用户"} else if($NF=="nologin") {print $1"是虚拟用户"} else {print $1"是其他用户"}}' /etc/passwd
练习:判断磁盘分区情况:利用率30以下输出该分区空闲,70以下较满,超过70严重不足
df | sed -n '2,$p' | tr -d % | awk '{ if($5 <= 30) {print $1"比较空闲"} else if($5 <= 70) {print $1"比较满"} else {print $1"空间不足"} }'
switch语句
类似多重if语句,switch对单个值判断
语法
switch (变量){ case 值1: 语法1;break case 值2: 语法2;break ...... default: 语法N }
案例
awk 'BEGIN{ f=1; switch (f) { case 1: {print "到1楼";break} case 2: {print "到2楼";break} default: {print "此楼不通"} } }'
练习:定义变量n代表权限数字,输出其代表的权限文字
如:6 ---> rw
#!/bin/bash for i in $@ do awk -v n=$i 'BEGIN{ switch(n) { case 0:print "-";break; case 1:print "x";break; case 2:print "w";break; case 3:print "wx";break; case 4:print "r";break; case 5:print "rx";break; case 6:print "rw";break; case 7:print "rwx";break; default:print "按错了"} }' done
while循环
语法
while (条件) {语句块}
求1~100的和
awk 'BEGIN{i=1;sum=0;while(i<=100){sum+=i;i++};print sum}'
示例:过滤/etc/passwd
文件中以root开头的行,输出每一列数据的字符长度
awk -F: '/^root/{i=1;while(i<=NF){print $i,length($i);i++}}' /etc/passwd
for循环
语法1: for(变量 in 数组) {语句} 语法2: for(变量;条件;表达式) {语句}
求1~100的和
awk 'BEGIN{sum=0;for(i=1;i<=100;i++){sum+=i};print sum}'
示例:过滤/etc/passwd
文件中以root开头的行,输出每一列数据的字符长度
awk -F: '/^root/{for(i=1;i<=NF;i++){print $i,length($i)}}' /etc/passwd
break和continue
break 停止循环 awk 'BEGIN{sum=0;for(i=1;i<=100;i++){sum+=i;if(i==50)break;};print sum}' continue 跳过本次循环 awk 'BEGIN{sum=0;for(i=1;i<=100;i++){if(i==50)continue;sum+=i;};print sum}'
next和exit
awk处理文字的过程类似循环,一行行处理
next 跳过awk本次读取的文字,类似continue exit 停止awk读取文字的过程,类似break,跳到END
案例:
1~10打印,跳过偶数 seq 10 | awk '{if($0%2==0)next;print $0}' 1~10打印,到5中断 seq 10 | awk '{if($0==5)exit;print $0};END{print "Game Over"}'
练习1:读取passwd遇到虚拟用户跳过
awk -F[:/] '{if($NF=="nologin")next;print $1,$NF}' /etc/passwd
练习2:打印passwd的用户和uid,到uid为1000的停止
awk -F[:/] '{if($3==1000)exit;print $1,$3}' /etc/passwd
数组
awk的数组是类似键值对的结构
address["wh"]="wuhan" print address["wh"] wuhan print address["sh"] 空字符串
注意:
-
awk数组为关联数组,实现key / vaule功能
-
可使用任意字符串;字符串要使用双引号括起来
-
如果某数组元素事先不存在,在引用时,awk会自动创建此元素,并将其值初始化为“空串”
-
若要判断数组中是否存在某元素,要使用“key in array”格式
-
获得数组长度 length(array)
awk 'BEGIN{weekdays["mon"]="Monday";weekdays["tue"]="Tuesday";print weekdays["mon"],weekdays["tue"],weekdays["wed"]}' awk 'BEGIN{weekdays["mon"]="Monday";weekdays["tue"]="Tuesday";print "mon" in weekdays,"wed" in weekdays}' awk 'BEGIN{weekdays["mon"]="Monday";weekdays["tue"]="Tuesday";for(i in weekdays){print weekdays[i]}}'
使用awk去重
awk '!arr[$0]++' test.txt
把test.txt中所有单词和出现次数打印出来
aaaa aaaa bbb bbb cccc arr[aaaa] 1 arr[aaaa] 2 arr[bbb] 1 arr[bbb] 2 arr[cccc] 1 awk '{arr[$0]++};END{for(i in arr)print i,arr[i]}' test.txt
函数
内置函数
rand(): 返回0和1之间一个随机数 srand(): 配合rand() 函数,生成随机数的种子 int(): 返回整数部分 20~30的随机数 awk 'BEGIN{srand();print 20+ int(rand() * 11)}' length([s]): 返回指定字符串的字符长度或数组的长度 sub(正则表达式,替换内容,$n): 替换指定内容 gsub(正则表达式,替换内容,$n): 全部替换指定内容 替换第1列中的第一个root awk 'sub(/root/,"superadmin",$1)' /etc/passwd 替换整行中的第一个root awk 'sub(/root/,"superadmin",$0)' /etc/passwd 替换整行中所有root awk 'gsub(/root/,"superadmin",$0)' /etc/passwd split($列数, 数组 , 分割符): 分割字符串保存到数组 awk '/^root/{split($0,arr,":");for(i in arr)print i,arr[i]}' /etc/passwd system("shell命令") 调用shell命令 awk 'BEGIN{system("ifconfig")}'