文本三剑客

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处理的数据行
IpI 参数忽略过滤信息大小写
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"] 空字符串

注意:

  1. awk数组为关联数组,实现key / vaule功能

  2. 可使用任意字符串;字符串要使用双引号括起来

  3. 如果某数组元素事先不存在,在引用时,awk会自动创建此元素,并将其值初始化为“空串”

  4. 若要判断数组中是否存在某元素,要使用“key in array”格式

  5. 获得数组长度 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")}'

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值