【Linux】grep、sed、awk练习

参考链接:Linux三剑客超全超详情教程
练习工具:Centos7虚拟机一台,用于远程登录的cmd窗口


【Linux】grep、sed、awk练习


一、grep与正则表达式

1.1 grep简介

grep (缩写来自Globally search a Regular Expression and Print)是一种强大的文本搜索工具,它能使用特定模式匹配(包括正则表达式)搜索文本,并默认输出匹配行。
简而言之,grep更擅长单纯的查找或匹配文本内容。

1.2 grep常用用法

1.2.1 grep filename

#查看/etc/passwd文件中包含“user”的行
grep "user" /etc/passwd

在这里插入图片描述

1.2.2 grep -i

#-i参数表示不区分大小写,通过grep -i 查看ssh是否允许root权限远程登录

grep -i "root" /etc/ssh/sshd_config

#由下图可以看到,sshd_conf设置中不允许root登录,只能普通用户登录

在这里插入图片描述

1.2.3 grep -v

#-v表示取反,可使用使用grep -v反选,查出默认shell为非/sbin/nologin的用户
grep  -v "sbin/nologin" /etc/passwd

在这里插入图片描述

1.2.4 grep -c

#-c统计行数,统计所有默认shell使用sbin/nolign的账户个数
grep  -c "sbin/nologin" /etc/passwd

在这里插入图片描述

1.2.5 grep -w

#-w 匹配一个完整的单词
mkdir test
cd test
echo test >>test.txt
echo test_file >>test.txt
echo Test >>test.txt
cat test.txt
#测试
grep "test" test.txt
grep "test" test.txt -w
grep "test" test.txt -iw

在这里插入图片描述
或者

#使用尖括号闭合单词
echo test_test >> test.txt
cat test.txt 
grep  "\<test\>" test.txt

在这里插入图片描述

1.2.6 grep -o

#-o 只输出匹配的字符
echo This is a test>>test.txt
grep "test" test.txt -o

在这里插入图片描述

1.2.7 grep -n

#-n 输出匹配行所在的行数
grep "root" /etc/passwd -n

在这里插入图片描述

1.2.8 grep -x

#-x 找出全列符合的行
cat test.txt
grep -x "test" test.txt
grep -xi "test" test.txt

在这里插入图片描述

1.2.9 grep -l && grep -L

#-l 找出当前目录存在"/bin/bash"的文件
grep -l "/bin/bash" *.*
#-L 找出当前目录不存在"/bin/bash"的文件
grep -L "/bin/bash" *.*

在这里插入图片描述

1.2.10 grep -e

#通过grep -e实现OR操作。
#语法:grep -e pattern1 -e pattern2 filename
grep -e "^100" -e "^500" employee.txt -n

在这里插入图片描述

1.3 grep与正则表达式

关于正则表达式可自行学习
参考链接:正则表达式

1.3.1 贪婪匹配

#通过点乘的结合实现零个或多个匹配,即,在100与Sales之间可以距离多个字符
cat employee.txt
grep "^100Sales" employee.txt -n
grep "^100.*Sales" employee.txt -n

在这里插入图片描述

1.3.2 grep -E

grep -E 选项可以用来扩展选项为正则表达式。 如果使用了grep 命令的选项-E,则应该使用 | 来分割多个pattern,以此实现OR操作。

grep "Manager|Deve" employee.txt
grep "Manager|Deve" employee.txt  -E

在这里插入图片描述

#问号表示零次或一次,下列表达式的含义为:包含5000或5500的行
grep "^.*5,5?00" employee.txt  -E

在这里插入图片描述

1.3.3 利用小括号进行分组过滤

#通过小括号实现分组过滤
echo -ne "#good\n#glad\n#lady\n" >> g.txt
cat g.txt
grep "goo|lad" g.txt -E
#想要得到glad或good,仅用"|"无法实现,因为得出的结果是包含goo或lad的行
#通过分组实现过滤,从而获取想要的结果
grep "g(oo|la)d" g.txt -E

在这里插入图片描述

#通过小括号实现分组过滤,并将前面的分组条件引用到后面
cat love.txt
grep -E "(like)|(love).*\1" love.txt
grep -E "(like)|(love).*\2" love.txt

在这里插入图片描述

1.3.4 找出/etc/passwd默认shell与用户名相同的行

#找出/etc/passwd中用户名与shell相同的分组,如halt
head /etc/passwd

在这里插入图片描述

#根据分组进行过滤
#[^:]+ 表示匹配多个不为冒号的字符
#\> 可以看作一个闭合,遇到右尖括号结束匹配
grep  "^([^:]+)\>" /etc/passwd -E 
grep  "^([^:]+)\>.*\1$" /etc/passwd -E -wn

在这里插入图片描述
在这里插入图片描述

1.3.5 找出init.d/functions中所有函数

#找出字符加括号的组合即可视为一个函数
vi /etc/init.d/functions
#\w等价于 A-Za-z_ 中任意一个
grep -E "\w+\(\)" /etc/init.d/functions

在这里插入图片描述
在这里插入图片描述

二、sed常用语法

Sed 主要用来自动编辑一个或多个文件、简化对文件的反复操作、编写转换程序等

2.1 sed基本语法

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.2 sed 查看指定行内容

#sed 默认输出所有结果
#-n或--quiet或--silent 仅显示script处理后的结果。
#p:打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行
cat ex.sh -n
sed "5,7p" ex.sh
sed "5,7p" ex.sh -n

在这里插入图片描述

#查看存在if的行
cat ex.sh -n|sed "/if/p" -n

在这里插入图片描述

2.3 sed 删除指定内容

cp ex.sh demon.txt
cat demon.txt -n
#删除1到2行并将结果显示在命令行窗口
sed "1,2d" demon.txt

在这里插入图片描述
但是再次查看文本内容时,会发现第1、2行并未被删除,这是因为sed只将文本读到内存,但不写入文本

cat demon.txt -n
#加入-i参数,将修改结果写入文本
cat demon.txt|sed "1,2d" -i demon.txt
cat demon.txt 

在这里插入图片描述
在这里插入图片描述

#删除包含if的行
sed "/if/d" demon.txt -i
cat demon.txt

在这里插入图片描述

#删除至最后一行
cat employee.txt -n

在这里插入图片描述

#从第3行删除至最后一行
sed '3,$d' employee.txt -i;cat employee.txt

在这里插入图片描述

2.4 sed 替换指定内容

2.4.1 全局替换

for i in {a..d};do for j in {1..4};do echo -ne "$i$j$j$j\t">>a.txt;done;
 echo "">>a.txt;done
cat a.txt
#全局替换,将所有制表符替换为"#"

在这里插入图片描述

#替换每一行最后一列的井号为空
sed "s/#$//g" a.txt

在这里插入图片描述

2.4.1 局部替换

cat p.txt
#局部替换,替换第二行的root为yu
sed "2s/root/yu/" p.txt
#局部替换,替换第二行的所有root为yu
sed "2s/root/yu/g" p.txt

在这里插入图片描述

在这里插入图片描述

2.5 sed 添加指定内容

2.5.1 在每一行前添加内容

#在第一行前添加内容
sed '1i This is a test' a.txt -i
cat a.txt

在这里插入图片描述

2.5.2 在每一行后添加内容

#在最后一行前添加内容
sed '$a end' a.txt -i
cat a.txt

在这里插入图片描述

#在每一行后面都添加相同内容
sed 'a ----------' a.txt -i
cat a.txt

在这里插入图片描述

2.5.3 在特定行开头添加注释符

cat c.txt
#在第二行第三行前添加注释符
# (^.)代表匹配到每一行开头任意一个字符
# #\1表示引用前者的分组,在分组1匹配到的字符前添加#+匹配的字符作为替换结果
#如果匹配到b,则后面替换的内容为#b;如果匹配到c,则后面替换的内容为#c
sed -r "2,3s/(^.)/#\1/" c.txt

在这里插入图片描述
在这里插入图片描述

2.6 利用sed获取ip地址

ifconfig > net.txt
cat net.txt -n|head -15
#利用sed获取第十行内容

在这里插入图片描述

2.6.1 方法一

#将不相关的字符全部替换为空
sed "10p" -n net.txt
sed "10p" -n net.txt |sed "s/^.*inet//"
sed "10p" -n net.txt |sed "s/^.*inet//"|sed "s/net.*//"

在这里插入图片描述
在这里插入图片描述

2.6.2 方法二

#搜索第十行内容,同时将ip地址前面的内容替换为空
sed "10s/^.*inet//p" -n net.txt

在这里插入图片描述

#利用-e参数进行多次操作
cat net.txt|sed -e "10s/^.*inet//p" -n -e "10s/net.*$//p" -n
cat net.txt|sed -e "10s/^.*inet[[:space:]]*//"  -e "10s/net.*$//p" -n

在这里插入图片描述

三、awk练习

3.1 awk简介

语法:

awk  [option] 'pattern[action]'   file
可选参数模式动作文件/数据
optionspatternactionfile

Action指的是动作,awk擅长格式化文本,且输出格式化后的结果,因此最常用的动作就是print和printf

常用命令选项:

-F fs fs指定输入分隔符,fs可以是字符串或正则表达式,如-F:
-v var=value 赋值一个用户定义变量,将外部变量传递给awk
-f scripfile 从脚本文件中读取awk命令

3.1.1 利用awk查询数据

cat c.txt
awk '{print $0}' c.txt
awk '{print $1}' c.txt

在这里插入图片描述

3.1.2 利用awk查询多列数据

cat c.txt
awk '{print $1,$2}' c.txt

在这里插入图片描述

3.2 awk变量

3.2.1 NR&&FNR

NR表示记录数,在执行过程中对应于当前的行号
FNR处理多个文件时显示行号

cat c.txt -n
cat c.txt -n|awk 'NR==3,NR==4'

在这里插入图片描述

cat c.txt -n
awk '{print NR,$0}' b.txt c.txt
awk '{print FNR,$0}' b.txt c.txt

在这里插入图片描述

3.2.2 NF参数

NF表示字段数,在执行过程中对应于当前的字段数

cat c.txt -n
#查询最后一列(第四列)
awk '{print $NF}' c.txt
#选出第二行,第三行中第一列,倒数第二列和最后一列的数据
awk 'BEGIN{print "\t   第1列 第3列 第4列"}NR==1,NR==3{print "第",NR,"行:   ",$1,$(NF-1),$NF}' c.txt

在这里插入图片描述
在这里插入图片描述

3.2.3 FS&&OFS

输入分隔符FS:字段分隔符(默认是任何空格)
输出分隔符OFS:output field separator,简称OFS

#获取第一列和第二列数据
cat b.txt
awk -v FS="#" '{print $1,$2}' b.txt
#指定字段间输出分隔符
awk -F "#" -v OFS="===" '{print $1,$2}' b.txt

在这里插入图片描述
在这里插入图片描述

#截取/etc/passwd最后5行内容
cat /etc/passwd -n |tail -5

#以分号为分隔符截取第一个字段和最后一个字段
cat /etc/passwd -n|tail -5|awk -F ":" 'BEGIN{print "\t   行号 用户  默认shell"}{print "\t",$1,$NF}'

在这里插入图片描述
在这里插入图片描述

3.2.4 RS&&ORS

ORS:输出记录分隔符(默认值是一个换行符)
RS:记录分隔符(默认是一个换行符),指定输入时的换行符

cat c.txt
#以空格作为换行分隔符,即空格变成了换行符
awk -v RS=" " '{print $0}' c.txt

在这里插入图片描述

cat c.txt
#指定输出时的换行符
awk -v ORS="------------\n" '{print $0}' c.txt

在这里插入图片描述

3.2.5 FILENAME

FILENAME:当前输入文件的名

cat c.txt
#指定输出时的换行符
awk '{print FILENAME,$0}' b.txt c.txt employee.txt

在这里插入图片描述

3.2.6 ARGC&&ARGV

ARGC:命令行参数的数目
ARGV:包含命令行参数的数组
ARGIND:命令行中当前文件的位置

awk '{print ARGIND,$0}' b.txt  employee.txt  c.txt

在这里插入图片描述

#查看当前命令行参数的个数
awk '{print ARGC,$0}' b.txt  employee.txt  c.txt

在这里插入图片描述

#查看数组中的参数
awk '{print ARGV[0],ARGV[1],ARGV[2],ARGV[3],$0}' b.txt  employee.txt  c.txt

可以看出,该数组由awk和文件名组成
在这里插入图片描述

3.2.7 自定义变量

在awk -v模式下,用户可以自定义变量

awk -v N1="Begin---" -v N2="---End" '{print N1,$0,N2}'  c.txt

在这里插入图片描述

#设置全局变量
awk1="---BEGIN----"
awk2="---END----"
awk -v N1=$awk1 -v N2=$awk2 'BEGIN{print N1}{print $0}END{print N2}'  c.txt

在这里插入图片描述

3.3 awk格式化输出

3.3.1 awk格式化

通过print功能,awk能够对文本进行简单的输出,并不能达到美化或者格式化输出的功能.通过printf可以实现awk格式化输出

3.3.2 printf的使用

3.3.2.1 print和printf的区别
1.print可以直接打印,而printf则需要指定fotmat
2.format用于指定后面的每个item的输出格式
3.print每次输出后会自动换行,但printf不会自动打印换行符:\n

例:

#print每次输出完会自动换行
awk '{print $0}' c.txt
#printf则不会,需要手动添加换行符
awk '{printf $0}' c.txt

在这里插入图片描述

3.3.2.2 format格式

%d,%i:以十进制形式输出带符号整数(正数不输出符号)
%e,%E:以科学计数法形式输出
%g,%G:%g会在%e和%f的输出中作比较,选择长度小的结果输出
%s:表示字符串
%u:无符号整数
%f:以浮点数形式输出
%c:显示单个字符
%%:表示%自身
-:表示左对齐,printf默认右对齐
+:表示数值符号,printf (%+d)

例:

3.3.2.1 %s
awk '{printf "%s--\n",$1}' c.txt

在这里插入图片描述

3.3.2.2 %d
for i in {10..20};do echo -ne "$[$i/2].$[$i/2]\t$i.$i\n">>cal.txt;done
cat cal.txt
awk '{printf "%d--%d\n",$1,$2}' cal.txt

在这里插入图片描述
在这里插入图片描述

3.3.2.3 %f
#以浮点数输出
awk '{printf "%d--%f\n",$1,$2}' cal.txt

在这里插入图片描述

3.3.2.4 %e
#以科学计数法输出
awk '{printf "%d--%e\n",$1,$2}' cal.txt

在这里插入图片描述

3.3.2.5 %g
#%g会在%e和%f的输出中作比较,选择长度小的结果输出
for a in e f g;do printf "%$a\t" 2000000 200.123;echo "";done

在这里插入图片描述
在这里插入图片描述

3.3.2.3 格式化输出
#利用printf格式化输出
cat c.txt
awk 'BEGIN{printf "\n----开始打印----"}{printf "\n第一列:%s    第二列:%s    第三列:%s    第四列:%s\n",$1,$2,$3,$4}END{printf "----打印结束-----\n"}' c.txt

在这里插入图片描述
在这里插入图片描述

3.3.2.4 利用awk格式化输出/etc/passwd文件
#查看/etc/passwd文件
cat /etc/passwd -n|head -5
#如下内容分别对应:
#用户名、密码(已加密)、UID、GID、描述信息、主目录、默认shell

在这里插入图片描述

#格式化输出/etc/passwd内容
cat /etc/passwd|tail -5|awk -F ":" 'BEGIN{printf "\n%-25s\t %-25s\t %-25s\t %-25s\t %-25s\
t %-25s\t %-25s\n","用户名","密码","UID","GID","描述信息","主目录","默认shell"}{printf "%-25s\t %-25s\t %-25
s\t %-25s\t %-25s\t %-25s\t %-25s\n",$1,$2,$3,$4,$5,$6,$7}'

在这里插入图片描述

3.4 awk模式

3.4.1 关系运算符

在这里插入图片描述

3.4.2 awk练习

3.4.2.1 普通输出

#awk打印输出前五行内容
awk 'NR<=5{print $0}' /etc/passwd

在这里插入图片描述

3.4.2.2 输出/etc/passwd中禁止登录的用户

#输出/etc/passwd文件中禁止登录的用户,即找出存在"/sbin/nologin"的行
awk -F ":" 'BEGIN{printf "\n%-25s\t %-25s\t %-30s\n","行号","用户名","默认shell"}/\/sbin\/nologin/{printf "%-25s\t %-25s\t  %
-25s\n",NR,$1,$NF}' /etc/passwd

在这里插入图片描述

3.4.2.3 输出/etc/passwd UID>=1000的行

#UID位于/etc/passwd中的第三个字段,即$3>=1000
cat /etc/passwd -n |awk -F ":" '$3>=1000{print $0}'

在这里插入图片描述

3.4.2.4 输出/etc/passwd中用户名r开头的行

#使用波浪号进行匹配
cat /etc/passwd  |awk -F ":" '$1~/^r/{print $0}'

在这里插入图片描述

3.4.2.5 利用awk统计访客数量

#查看日志
cat access_log-20221213 |tail -10

在这里插入图片描述

#以空格为分隔符,根据第一列的ip地址统计访客数量
#sort -n 从小到大排序,从大到小排序为sotr -r
#wc -l 统计行数
#uniq 去重显示重复次数 

在这里插入图片描述
在这里插入图片描述

#统计所有访问ip数量,即利用wc -l命令统计行数
#uniq 去掉重复的ip地址,sort -n从小到大排序
awk '{printf "%s\t %s\n","访客",$1}' access_log-20221213|sort -n|uniq |wc -l

共有三个访客
在这里插入图片描述

3.4.2.6 利用awk统计访问最频繁的前10个ip

#uniq -c去重,并统计重复次数
#在此基础上再次使用sort -n从大到小排序,并利用head命令统计出访问频繁的前10个ip
awk '{printf "%s\t %s\t  %s\n","访问次数","访客",$1}' access_log-20221213|sort -n|uniq -c|sort -r|head -10

在这里插入图片描述

3.4.2.7 awk实现多次分割

for i in {1..5};do echo -ne "Date:$i/$i Name:AAA$i Donate:$[$i+1000] telphone:$i$i$i$i$i$i$i\n\n">> t.txt;done
cat t.txt
#以冒号为分隔符
awk -F ":" -v OFS="\t" '{print $1,$2,$3,$4}' t.txt
#以空格为分隔符
awk -F " " -v OFS="\t" '{print $1,$2,$3,$4}' t.txt

在这里插入图片描述
以冒号为分隔符
在这里插入图片描述
以空格为分隔符
在这里插入图片描述

发现都无法完整取出Donate里面的值
此时需要用多个分隔符取出

#语法 awk -F "[]"
#同时使用空格和冒号进行分割,并统计内容被切割成几列
awk -F "[ :]" -v OFS="\t" 'NR==1{print NF}' t.txt
#多次分割
awk -F "[ :]" -v OFS="\t" '{print $1,$2,$3,$4,$5,$6,$7,$8}' t.txt
#输出第六列
awk -F "[ :]" -v OFS="\t" '{print $6}' t.txt

在这里插入图片描述

在这里插入图片描述

#结合正则表达式,去除空行
awk -F "[ :]" -v OFS="\t" '!/^$/{print $6}' t.txt

在这里插入图片描述

#输出捐赠金额为1005的人的电话号码
awk -F "[ :]" -v OFS="\t" '/1005/{printf "%s\t%s:%s\n",$6,$7,$8}' t.txt

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值