三剑客通配符
2022-10-07 08:10:59 0 举报
AI智能生成
Linux-三剑客 grep awk sed 基础用法
作者其他创作
大纲/内容
当你在查找特定文件名,却不记得如何拼写时,通配符是帮你寻找的神器。
通配符是专门用于处理文件名的特殊字符,而不是文件内容!
可以方便查找类似、但是不相同的文件名。
通配符是shell的内置语法、大部分linux命令都认识通配符
大多数时候结合find 对文件进行查找
最后再说一次!通配符是找文件名 !!! 文件内容是正则的
什么是通配符
匹配任意(0或多个)字符串,包括空字符串
ls y*.txt
找出以y开头的txt文件
find / -name '[0-9]*.sh'
找出机器上,所有的以数字开头的sh文件
* 匹配任意字符
匹配任意1个字符,且只有一个字符
作用不大,只用于特定场景
很少用
ls ?.txt;ls ??.txt; ls ???.txt
一个问号就表示一个字符,几个个问号就几个字符
? 匹配任意一个字符
[abcd] 匹配方括号里的abcd任意一个字符,abcd可以是其他不连续的字符如[aqwd]
[a-z] 找到a到z之间的所有字母,不区分大小写了
注意点
ls y[0-9a-z].log
#找出以y开头相关的log ,用中括号去找
以及注意,一个括号表示的是匹配一个字符,而不是多个字符
[] 匹配方括号里的内容
不匹配方括号里的任意字符
也可以写为连续的字符,如[!a-z],也就是不匹配a到z任意的一个字符,且!符可以用^替代,写成[^abcd]
ls [!yu]*
ls [^yu]*
排除所有名字里包含y和u字符开头的文件,注意加上星号
ls [!yu].sh
找出任意除了y和u的单个字符的sh文件
[!字符] 或[^字符]
find /etc -name '*hosts*'
搜索/etc下所有包含hosts相关字符的文件
find /etc -name 'ifcfg*'
搜索/etc下的以ifcfg开头的文件(网卡配置文件)
find /etc -name 'ifcfg*[0-9]'
只查找以数字结尾的网卡配置文件
find /dev -name 'sd?'
找到系统中的第一块到第四块磁盘,注意磁盘的语法命名
find /dev -name 'sd?[0-9]'
找找sdb硬盘有几个分区
find找文件与通配符
常用通配符
正则表达式就是为了`处理大量的字符串`而定义的一套规则和方法。
通过定义的这些特殊符号的辅助,系统管理员就可以快速过滤,替换或输出需要的字符串。
Linux 正则表达式一般以行为单位处理的。
正则主要包含了三个命令,sed、awk、grep三剑客命令
正则表达式是一套规则和方法
正则工作时以单位进行,一次处理一行
正则表达式化繁为简,提高工作效率
linux仅受三剑客(sed、awk、grep)支持,其他命令无法使用
正则的使用
正则表达式应用非常广泛,很多编程语言都支持正则表达式,用于处理字符串提取数据。
通配符是大部分普通命令都支持的,用于查找文件或目录
而正则表达式是通过三剑客命令在文件(数据流)中过滤内容的,注意区别
以及注意字符集,需要设置`LC_ALL=C`,注意这一点很重要)(常常脚本中使用)
注意事项
大部分普通命令都支持
通配符是查找文件或目录
只有三剑客可以使用
正则处理的是内容和数据
注意,通配符和正则的区别
正则表达式
正则表达式的作用
LC_ALL=C 这个变量赋值的动作,是还原Linux的字符集
因为我们系统本身是支持多语言系统的,生成了不同的编码表
不同的编码表,不同的符号可能不同,不兼容,所占字符也不同
如果你的系统编码是中文,很可能导致你的正则出错
还原字符集的作用
防止导致正则或程序出错
export LC_ALL=C
locale
可以查看系统的支持语言
使用
字符集设置
默认的都是基础正则模式
包含了一些特殊字符
基础正则表达式
使用扩展需要加参数,否则不能识别
包含了一些其他的元字符
扩展正则表达式
反斜杠 \\反斜杠用于在元字符前添加,使其成为普通字符
转义符
正则表达式分类
所见即所得,可以用于匹配如标点符号,还原其本义。
没使用变量的话,请你都用单引号
能够识别linux的特殊符号、或变量,需要借助转义符还原字符本义。
如果涉及变量,建议使用双引号
当需要引号嵌套时,一般做法是,双引号,嵌套单引号。
关于单引号、双引号
grep,过滤关键字信息数据。主要是用于查文本内的数据
-i :不区分字符的大小写
-o :仅显示匹配到的字符串本身,只输出匹配内容
用于排除空行
过滤查找的信息中grep自己的信息
-v :显示不能被模式匹配到的行,排除匹配结果
-E :支持使用扩展的正则表达式元字符
-n :显示行号
-c :统计行数
grep命令常用的语法
grep '^m' t1.log -n -i
找出m或M开头的行(忽略大小写)
grep '^my' t1.log -i -n -o
写于最左侧,表示匹配以什么开头的行
^ 尖角符
grep 'n$' t1.log
匹配所有以字符n结尾的行
点注意使用转义为普通字符
grep '\\.$' t1.log
匹配所有以.结尾的行
word$ 匹配以word结尾的行
$ 美元符
排除文件中的空行
常常用在查看配置文件中
grep '^$' t1.log -n -v
及开头与结尾都没有内容
^$ 匹配空行
开头结尾
找出符合.ac正则的行,任意的字符后有ac的行,一共是三个连续的字符
grep '.ac' t1.log
. 匹配除换行符的所有字符
匹配除了换行符以外所有的内容、字符+空格,除了换行符。
. 点符
让有特殊意义的字符,现出原形,还原其本义
\\ 转义符
\\b 匹配单词边界
\ 匹配换行符
\\t 匹配一个横向的制表符
元字符
匹配,转义
加上 -o 才会过滤到找出的信息
grep 'w*' t1.log #这样会找到所有的信息
重复前一个字符0此或n次
找出任意内容,[这一行有东西,没东西,]全给找出来,是*的作用
.* 符
以任意内容开头
^.*符号
以任意多个字符结尾的行
.*$ 符
*星号
[abc] 匹配括号内的小写a、b、c字符
匹配括号内的内容
[A-Z] 匹配大写字母
[a-z0-9] 匹配小写字母和数字
[a-z0-9A-Z] 匹配大写、小写字母、数字,没有空格,特殊符号
也不能使用!(叹号),这个是通配符使用的,不是正则
注意不能使用-v ,-v是取没有找到的行,不是对应的字符
[^a-zA-Z0-9]只想拿到特殊符号,对中括号里的字符进行取反即可
[ ] 中括号
基础正则
扩展正则在使用时需要注意,一般都需要添加参数,否则默认只支持正则,扩展的符号可能不识别
grep -E xxx
使用-E参数是最新扩展正则用法
注意
Main Topic
grep -E '8{3}' t3.log
正好匹配a字符n次
a{n}
匹配a字符n<=x<=m次
匹配最少多少次
匹配最多多少次
{ } 花括号
注意,最少是一次,不能为0
注意和*的区别,*是0次或多次,找不到的那一行,也会显示出来
#重复前一个字符1次或多次#匹配一次或者多次,没有的行是不会显示的
grep -E '[0-9]+' t3.log
从文中找出连续的数字,等于排除字母,特殊符号、空格
grep -E '[0-9]{11}' t3.log
当找出的数字有限定时,比如手机号码11位数字
[0-9]+
grep -E '[A-Za-z0-9]+' t1.log -o
去除标点符号
[A-Za-z0-9]+
+加号
竖线在正则里是或者的意思
注意第二给grep不要加文件名,它处理的数据是第一个
grep '^$' t1.log -v | grep '^#' -v
直接排除空行或注释行
grep -E '^$|^#' t1.log -n -v
| 或者符
简单理解为分组
() 作用是将一个或者多个字符捆绑在一起,当做一个整体进行处理
小括号功能之一是分组过滤被括起来的内容,括号内的内容表示一个整体
1.可以用括号,把正则括起来,以及系统最多支持9个括号
括号()内的内容可以被后面的\"\\"正则引用,n为数字,表示引用第几个括号的内容\\1:表示从左侧起,第一个括号中的模式所匹配到的字符\\2:从左侧起,第二个括号中的模式所匹配到的字符
2.括号内的数据,可以向后引用,() () () () \\1 \\2 \\3 \\4
grep -E 'g(oo|la)d' t3.log
要求仅仅匹配出glad和good(将数据当成一个整体来处理)
grep -E '^.*(love).*\\1.*' lovers.log
提取love出现2次的行
cat /etc/passwd | grep -E '^(.*):.*\\1$'
提取/etc/passwd中用户名和登录解释器名字一样的行
( ) 括号
扩展正则
grep
sed ,对文本数据进行编辑,修改原文件内容
他会有一个字符工场(sed模式空间),不是直接对原数据处理
匹配失败也会将默认的结果输出到终端,不取消默认输出会看见多行
sed是Stream Editor(字符流编辑器)的缩写,简称流编辑器。
过滤指定字符信息
取出指定的字符行
修改文件内容
常用功能
实现对文件内容增删改查
sed 简介
sed [选项] [sed内置命令字符] [输入文件]
sed 软件参数
sed 命令
使用扩展正则时记得加上参数 -r
注意:sed默认是不会修改源文件的,只有加上-i才会修改,但是最好加上-c 进行替换才不会破坏源文件的连接
sed 语法格式
sed默认是一行一行,处理文件中每一行的数据
全文处理
空地址
指定文件某一行
单地址
被模式匹配到的每一行#写入正则,字符数据#
/pattern/
范围区间
1~2,表示1、3、5 奇数行
2~2两个步长,表示2、4、6 偶数行
步长
可以使用 seq命令,生成一个序列 seq 1 10
对3到末尾行操作,包括3行
对匹配字符yuchao到chaoge的行操作
可以指向范围
sed匹配范围
表示在指定行与行之间,添加新字符数据
在文件第二行后,插入数据
sed '2a \"今天又是美好的一天\" ' t1.log
在第二行前,插入数据
sed '2 i 今天雾霾比较大' t1.log
单行增加
cat >>my.log<<EOF你好我好他也好EOF
以前可以通过,cat实现多行文本追加
可以使用 >> 多次增加,也可以写换行符
echo -e \"hello\world\你好\我也好\" > hello.log
单引号会原样输出
需要使用双引号加上参数 -e 识别特殊符号
echo 追加多行数据
sed是按行处理文本,可以指定要处理的行,也就是在指定行插入字符数据
及换行符
使用\添加多行数据
sed '1 i 加油\奥里给' t1.log
给t1.log 开头,添加两行数据
sed追加多行文本
多行增加
这两种写法都只能在文件的末尾进行追加,有很大的局限性
增
通过d命令,剪切(删除)数据。
sed ' d ' t1.log
如果不指定范围,sed默认是删除所有文本行数据了
-i 直接将修改的数据写入到文本
sed -i '2 d ' t1.log
删除第二行
sed删除n到m行
删除第三行开始,向下2行,及3-5行
sed '1~2 d ' t1.log
sed '2~2 d' t1.log
保留前二行(及删除后面的行)
sed '/game/ d' t1.log
找到game那一行,且删掉
删除game这一行到结尾
sed '/game/d;/http/d' t1.log
删除game和http的行也就是删除了2个指定的行
删除与范围问题
sed '/^My/d' t1.log
删除My开头的行
sed '/^My/Id' t1.log
sed忽略大小写的指令(重要)sed提供了 大写的I 指令 --- 用于忽略大小写
sed '/\\.$/d' t1.log#需要注意转义
删除以.结尾的行
sed '2d;5d' t1.log#使用分号,表示一条一条执行删除
删除2和5两行
最好不要使用模糊匹配,要精准的指向某一行,不然容易出错
删除正则匹配相关
sed '/yuchao/!d' t1.log
除了有字符yuchao的行,其他都删除
感叹号在很多命令里都是取反的作用,sed也一样,但是是和`sed命令`结合用
感叹号取反
删
如修改nginx的端口
修改mysql的数据存储路径
sshd_config配置文件
因为我们需要用sed来修改各种配置文件,sed这种非交互式修改文件内容,在脚本中实现自动化修改是最常见的。
c 把选定的行改为新的文本。
#语法sed '行号 c 修改后的内容' file
sed -i '/^SELINUX=/c SELINUX=disabled' /etc/selinux/config
也可以使用正则进行替换
替换整行命令(c命令)
语法:sed 's/替换前字符/替换后字符/g' file
s 将每一行第一处匹配的字符替换
g 全局替换global,每一行,每一处匹配的字符都替换
这个功能占用了sed使用率的80%,基本替换的功能都是这个s指令
建议用这个#号,作为分隔符,因为其他符号也经常用到sed 's#old_string#new_string#'如果使用的是/ 当遇到路径时,每次都需要进行转义,麻烦
sed 's#yuchao#老于#p' t2.log -n
替换一次
sed 's#yuchao#老于#gp' t1.log -n
替换多次,全局替换
sed '3 s#computer#linux#gp' t2.log -n
指定行进行替换
sed 's#my#His#Ig' t1.log
添加忽略大小写的命令
字符yuchao改为老于
添加shell变量new_name=\"彭于晏\"
需要先添加shelll变量
sed \"s#yuchao#$new_name#g\" t1.log
使用变量
sed使用shell变量
() \\1向后引用分组数据
sed软件也提供了()分组功能,可以取出对应的数据
ifconfig ens33 | sed -e '2 s#^.*inet##' -e '2s#netmask.*##p' -n
ifconfig ens33 | sed -r '2 s#^.*inet\\s+(.*)\\s+n.*#\\1#p' -n
直接使用分组,将括号内的内容提取出来
取ip
.*匹配规则是匹配到最后一个,不是在第一个条件达成就停止,是最后一个满足条件才停止提取使用时一定需要加入限制条件,才能得到需要的数据
使用正则,分组替换(好用)
替换字符(s命令)
改
sed打印命令p 打印sed正则处理后的数据
固定用法,只要使用到了p打印些数据,就是想输出指定数据必然用-n取消默认打印,目的是,只看到你想p打印的那些数据
sed '2 p ' t1.log
打印第二行
sed -r '/[0-9]{9}/p' t1.log -n
只显示qq号那一行
查
作用是将sed操作结果,写入到指定文件中
格式:sed '/模式(正则)/w new_file' old_file
sed '/computer/w game2.log' t1.log -n
注意,再次使用的是覆盖,并不是进行追加
可以自己创建文件,不需要文件存在
找出computer这一行,数据写入到game2.log文件中
w命令
-e选项用于接上sed多个命令
语法sed -e 'sed命令' -e 'sed命令' -e 'sed命令'
ifconfig ens33 | sed -e '2s/^.*inet//' -e '2s/netmask.*//p' -n
sed提取ip地址
-e选项
分号也用于执行多条命令,和linux基础命令一样支持这种写法。
sed '1p;2p;4p' t1.log -n
; 分号
sed其他命令
sed
它可以理解为不是单单的一门软件了,awk更是是一门编程语言,支持条件判断、数组、循环等功能
awk是一个强大的linux命令,有强大的文本格式化的能力,好比将一些文本数据格式化成专业的excel表的样式。
awk,更适合格式化文本内容,对文本进行复杂处理后、更友好的显示
对文本行数据提取数据字段
正则模式匹配
匹配到数据后的动作
模式、动作
awk内置变量(默认预留变量)
awk实现的作用
awk原理
awk 语法格式: awk [options] 'pattern {action}' file awk 命令 awk参数 模式 动作 数据流输入文件数据
找出那些行进行处理
模式:就是去寻找,使用的方法,如通配符,正则等
即是进行打印还是什么问题
动作:就是找到数据后,需要修改的动作
awk的语法
awk '{print $0}' csawk.log
不写模式、默认处理每一行
只有动作
awk 'NR>=2&&NR<=6' yuchao.log
awk不指定动作的话,默认打印整行信息
只有模式
即指定模式,也指定动作
多个模式和动作
{print}
awk的动作,必须写在花括号里
是交给awk指向,不是bash!!!!
pattern和action都要用单引号,防止shell作特殊解释
不写会卡住不动
注意给awk传入数据,一般都是file
cat csawk.log | awk 'NR==2{print $(NF-1)}'
也可以是管道传递的数据
注意点:
awk模式和动作
echo cc{01..50} | xargs -n 5
参数用法解释
生成连续的数列
{n..m}
-n 选项限制单个命令行的参数个数
测试数据的生成
NR 行
输出第二行
NR== 等于行
NR>= 大于等于行NR<= 小于等于NR>=N && NR<=M 从N行到M行|| 或的用法
行变量NR、匹配范围语法number of record
直接写NF变量表示每一行字段的总数
awk 'NR==2{print $0}'csawk.log提取出第二行的数据
$0 输出所有字段
$N 输出第N列字段$NF 输出最后一列$(NF-1) 输出倒数第2列
列变量NF、每一列的字段number of field
行和列的理解
FS:字段分隔符,默认是空格和制表符。
OFS:输出字段的分隔符,用于打印时分隔字段,默认为空格。
列
RS:行分隔符,用于分割每一行,默认是换行符。
ORS:输出记录的分隔符,用于打印时分隔记录,默认为换行符。
行
awk -F ' '
-F 紧跟分隔符,表示读入的字段以输入的分隔符分割
-F
awk -v FS=' '
-v 进入变量模式 可以进行变量的赋值及调用(调用不需要加$符)
-v
修改变量的参数
此时修改的都是字段分隔符,且都是空格
其他内置变量
awk在数据输入时,读取的一个行分隔符
RS变量作用是
打印数据后,的一个行分隔符
ORS变量的作用是
awk看到空格就认为是新的一行数据awk -v RS=' ' '{print $0}' test_awk.log
修改RS变量
awk -v ORS='@@' 'NR<=3{print $0}' csawk.log
把awk输出的行分隔符,改为 @@
修改ORS变量
RS变量/ORS变量
测试数据
简单处理,找到空格就改为换行,修改RS,数据输入换行符,改为RS=' '
有的单词结尾里带符号
复杂处理,找到非连续的大小写字母,就换行
1.将一整行的数据,改为,每一个单词,就是一行
2.改为这样后,就可以交给sort去排序了
uniq -c 去重+统计
3.再去uniq 去重 -c 统计重复的次数
解题思路
awk -v RS=' ' '{print $0}' 1.txt
分行
awk -v RS=' ' '{print $0}' 1.txt | sort
排序
awk -v RS=' ' '{print $0}' 1.txt | sort | uniq -c | sort -r | head -5
统计
简单处理
awk -v RS='[^a-zA-z0-9]+' '{print $0}' 1.txt | sort -n| uniq -c | sort -r -n | head -5
使用正则将不是字母和数字的当为分隔符
复杂处理
awk答题
#用法#echo 'hello world' | tr 'll' 'LL'heLLo worLd
tr命令就是将字符替换的作用
-c 保留字符集1的字符,其他的字符(包括换行符\)用字符集2替换
-s 将重复出现的字符串压缩为一个字符串
tr 命令的一些参数
将空格和其余标点符号变为 \ 并且压缩为一个字符串(防止出现空行)
cat 1.txt | tr -cs 'a-zA-Z0-9' '\' | sort -n | uniq -c | sort -nr | head -5
解题
tr命令
#核心还是将文本中的空格和其余符号变为换行符
sed -r 's#[^a-zA-Z0-9]+#\#g' 1.txt | sort -n | uniq -c | sort -nr | head -5
sed命令
直接取出连续字母字符即可
grep -E '[a-zA-Z]+' 1.txt -o | sort -n | uniq -c | sort -nr | head -5
grep命令
面试题解析
如/etc/passwd 中需要提取信息里面使用的是:进行分隔
默认的分隔符为空格,但是有时不太适用
指定分隔符FS
就是每个逗号的作用
决定awk输出每个字段的分隔符是什么,默认是空格
输出字段分隔符OFS
-t 判断输入行的列数来创建一个表。分隔符是使用在-s中指定的字符。如果没有指定分隔符,默认是空格
column,格式化列显示
美化输出
FS变量/OFS变量
结尾是bash的行
awk -v FS=':' '/bash$/{print $1}' /etc/passwd
指定最后一个字段的正则匹配
awk -v FS=':' '/\\/bin/bash$/{print $1}' /etc/passwd
awk提取出允许登录的用户名
BEGIN模式作用是在awk开始读取文件行数据、之前就先执行,一般用于预定义一些操作
BEGIN后面必须跟上action动作
语法awk 'BEGIN{} 模式 {动作}'#注意括号里的语法,模式加在两者之间
BEGIN模式
END就是awk结束后的操作
END是awk读取完所有的文件后,再执行END模块,一般用来总结、格式化打印一个结果
END模式
awk进阶
提取系统前五个用户的,用户名、uid、gid、家目录、登录解释器、设置为表头且结束后提示,awk已经处理完毕
awk -v FS=':' 'BEGIN{print \"用户名\
awk
. 当前工作路径,表示当前文件夹本身;或表示隐藏文件 .yuchao.linux
.. 上一级目录
路径相关
在于区分一个字符串的边界
因为linux识别,命令,参数,文件对象,中间是以空格区分的
在建立文件时不使用引号,会建立两个文件
echo 'hello world'
引号意义
\"\" 双引号、可以解析变量及引用命令
`` 反引号、可以解析命令
无引号,一般我们都省略了双引号去写linux命令,但是会有歧义,比如空格,建议写引号
引号相关
ls *.txt > all_txt.file#无论你如何写,得到的都是最后一次写入的数据
> stdout覆盖重定向
ls *.txt >> all_txt.file#追加,在文档后追加,写几次就有几个
>> stdout追加重定向
将数据交给前面的命令处理
< stdin重定向
0 stdin 数据输入,如键盘的输入,如文件数据的导入1 stdout 正确输出2 stderr 错误输出
数据流代号
#注意使用方法。写在最后面
2>&1
2> stderr重定向
ls /etc/weqwwqq > 1.txt 2>&1
#把stderr当做stdout进行处理
重定向符号
make && make install#make执行完成之后再执行make install
必须上一个的命令正确执行,下一个命令才会执行
command1 && command2 # command1成功后执行command2
#如果第一个执行成功,第二个命令不执行
command1 || command2 # command1失败后执行command2
#作用就是执行多个Linux命令,无论对错
command1 ; command2 # 无论command1成功还是失败、后执行command2
#需要和双引号结合使用
\\ # 转义特殊字符,还原字符原本含义
touch \"nginx_`date '+%F#%T'`.log\"#最好使用共同的模式,好去执行awk等进行批量处理
#当你进行引号嵌套时,请你这样用,#最外层用双引号,内层用单引号而且文件名最好不要出现空格
$() # 执行小括号里的命令,优先执行()内的内容`` # 反引号,和$()作用一样
| # 管道符,对命令的结果进行多次加工
生成英文字母序列,数字序列,用于文件拷贝的文件名简写
{} # 生成序列
命令执行
特殊符号
#没有双引号,此时文件夹会生成两个文件,应为 date '+%F %T'输出的结果会出现一个空格,最后touch会当成两个文件处理。
#因此,在结合特殊命令时,请加上双引号,表示限定字符串区间
#可能会出现如下的状况touch now_`date '+%F %T'`.log
务必使用双引号,别用无引号
都会优先用双引号,因为能识别特殊符号,可以做很多事
有linux命令、或者变量、特殊转义符等,用双引号
- 配置文件注释符号- shell命令注释符号
# 符号
易踩坑的点
简写备份
文件名中有空格,会不认识,找不到对应文件
使用应用命令东西$() 和反引号 ` `
一个是前面的命令执行成功才执行,一个是执行失败才执行
&& 和 || 的区别
一些常见用法
通配符
0 条评论
回复 删除
下一页