文本三剑客及find
通配符
匹配文件名称
*:匹配0或多个字符
?:匹配任意一个字符
[list]:匹配list中任意单个字符
[c1-c2]:匹配c1-c2中任意单个字符
[^c1-c2]/[!c1-c2]:不匹配c1-c2中任意字符
{string1,string2,...}:匹配{}中任意单个字符串
find文件查找
通过遍历指定路径下的文件系统完成文件查找
find [选项] [路径] [查找条件 + 处理动作]
查找路径:指定具体目录路径,默认是当前文件夹
查找条件:指定的查找标准(文件名/大小/类型/权限等),默认是找出所有文件
处理动作:对符合条件的文件做什么操作,默认输出屏幕
查找条件
根据文件名查找:
-name "filename" 支持global
-iname "filename" 忽略大小写
-regex "PATTERN" 以Pattern匹配整个文件路径字符串,而不仅仅是文件名称
根据属主和属组查找:
-user USERNAME:查找属主为指定用户的文件
-group GROUPNAME:查找属组为指定属组的文件
-uid UserID:查找属主为指定的ID号的文件
-gid GroupID:查找属组为指定的GID号的文件
-nouser:查找没有属主的文件
-nogroup:查找没有属组的文件
根据文件类型查找:
-type Type:
f/d/l/s/b/c/p
根据文件大小来查找:
-size [+|-]N[bcwkMG]
根据时间戳:
天:
-atime [+|-]N
-mtime
-ctime
分钟:
-amin N
-cmin N
-mmin N
根据权限查找:
-perm [+|-]MODE
MODE:精确权限匹配
/MODE:任何一类(u,g,o)对象的权限中只要能一位匹配即可
-MODE:每一类对象都必须同时拥有为其指定的权限标准
组合条件:
与:-a
或:-o
非:-not
相关案例:找出/tmp目录下,属主不是root,且文件名不是fstab的文件:
find /tmp \( -not -user root -a -not -name 'fstab'\) -ls
处理动作
-print:默认的处理动作,显示至屏幕
-ls:类型于对查找到的文件执行“ls -l”命令
-delete:删除查找到的文件
-fls /path/to/somefile:查找到的所有文件的长格式信息保存至指定文件中
-ok COMMAND {}\:对查找到的每个文件执行由COMMAND指定的命令
对于每个文件执行命令之前,都会交换式要求用户确认
-exec COMMAND {} \:对查找到的每个文件执行由COMMAND指定的命令
[root@server1 ~]# find /etc/init.d/ -perm -111 -exec cp -r {} dir1/ \;
{}:用于引用查找到的文件名称自身
注意:find传递查找到的文件至后面指定的命令时,查找到所有符合条件的文件一次性传递给后面的命
令;另一种方式可规避此问题
find | xargs COMMAND
正则表达式
匹配文件内容,匹配字符串的
##字符匹配
.:匹配任意单个字符
[]:匹配指定范围内任意单个字符
[^]:匹配指定范围外任意单个字符
[:alnum:]:字母与数字字符
[:alpha:]:字母
[:blank:]:空格或制表符
[:cntrl:]:ASCII控制字符
[:digit:]:数字
[:graph:]:非控制、非空格字符
[:lower:]:小写字母
[:print:]:可打印字符
[:punct:]:标点符号字符
[:space:]:空白字符,包括垂直制表符
[:upper:]:大写字母
[:xdigit:]:十六进制数字
##匹配次数
*:匹配前面的字符任意次数
.*:匹配任意长度的字符
\?:匹配其前面字符0或1次,即前面的可有可无
\+:匹配其前面的字符至少1次
\{m\}:匹配前面的字符m次
\{m,n\}:匹配前面的字符至少m次,至多n次
\{0,n\}:匹配前面的字符至多n次
\{m,\}:匹配前面的字符至少m次
##位置锚定
^:行首锚定,用于模式的最左侧
$:行末锚定,用于模式的最右侧
^PATTERN$:用于模式匹配整行;
^$:空行
\< 或 \b:词首锚定,用于单词模式的左侧
\> 或 \b:词尾锚定,用于单词模式的右侧
\<PATTERN\>:匹配整个单词
##分组
\(\):将一个或多个字符捆绑在一起;当作一个字符
\(xy\)*ab
Note:分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命令
方式为:
\1,\2,\3……
\1:从左侧起,第一个左括号以及与之匹配右括号之间的模式所匹配到的字符;
\(ab\+\(xy\)*\):
\1:ab\+\(xy\)*
\2:xy
扩展正则表达式
##字符匹配
.
[]
[^]
##次数匹配
*
?:0次或1次
+:1次或多次
{m}:匹配m次
{m,n}:至少m次,至多n次
##位置锚定
##分组
()
##或者
a|b
C | cat :C或cat
(C|c)at : C或c
Linux三剑客之grep
选项 描述
-E :--extended--regexp 模式是扩展正则表达式(ERE)
-i :--ignore--case 忽略大小写
-n: --line--number 打印行号
-o:--only--matching 只打印匹配的内容
-c:--count 只打印每个文件匹配的行数
-B:--before--context=NUM 打印匹配的前几行
-A:--after--context=NUM 打印匹配的后几行
-C:--context=NUM 打印匹配的前后几行
--color[=WHEN] 匹配的字体颜色,别名已定义了
-v:--invert--match 打印不匹配的行
-e 多点操作eg:grep -e "^s" -e "s$"
正则表达式(基于grep)
- 功能就是用来检索、替换那些符合某个模式(规则)的文本,正则表达式在每种语言中都会有;
- 正则表达式就是为了处理大量的文本或字符串而定义的一套规则和方法
- 通过定义的这些特殊符号的辅助,系统管理员就可以快速过滤,替换或输出需要的字符串
- Linux正则表达式一般以行为单位处理
. 匹配任意单个字符(必须存在)
^ 匹配以某个字符开头的行
$ 配以什么字符结尾的行
* 匹配前面的一个字符出现0次或者多次;eg:a*b
.* 表示任意长度的任意字符
[] 表示匹配括号内的一个字符
[^] 匹配[^字符]之外的任意一个字符
[] 匹配非[^字符]内字符开头的行
< 锚定 单词首部;eg:<root
> 锚定 单词尾部:eg:root>
{m,n} 表示匹配前面的字符出现至少m次,至多n次
() 表示对某个单词进行分组;\1表示第一个分组进行调用
查看配置文件时去除所有的注释和空行
[root@localhost ~]# grep -Ev "^#|^$" /etc/ssh/sshd_config
Linux三剑客之sed
语法
sed的命令格式: sed [option] 'sed command' filename
sed的脚本格式:sed [option] -f 'sed script' filename
常用选项:
-n :只打印模式匹配的行
-e :直接在命令行模式上进行sed动作编辑,此为默认选项
-f :将sed的动作写在一个文件内,用–f filename 执行filename内的sed动作
-r :支持扩展表达式
-i :直接修改文件内容
查询文本的方式
使用行号和行号范围
x:行号
x,y:从x行到y行
x,y!:x行到y行之外
/pattern:查询包含模式的行
/pattern/, /pattern/:查询包含两个模式的行
/pattern/,x:x行内查询包含模式的行
x,/pattern/:x行后查询匹配模式的行
动作说明
常用选项:
p:打印匹配的行(-n) a 的后面可以接字串,而这些字串会在新的一行出现
=:显示文件行号
a\:指定行号后添加新文本
i\:指定行号前添加新文本
d:删除定位行
c\:用新文本替换定位文本 c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行
w filename:写文本到一个文件
r filename:从另一个文件读文本
s/旧/新/:替换
替换标记:
g:行内全局替换
p:显示替换成功的行 通常 p 会与参数 sed -n 一起运行
w:将替换成功的结果保存至指定文件
q:第一个模式匹配后立即退出
{}:在定位行执行的命令组,用逗号分隔
g:将模式2粘贴到/pattern n/
在testfile文件的第四行后添加一行,并将结果输出到标准输出
[root@localhost ~]# sed -e 4a\newline test
将 /etc/passwd 的内容列出并且列印行号,同时,请将第 2~5 行删除
[root@localhost ~]# nl /etc/passwd | sed '2,5d'
Linux三剑客之awk
awk '{pattern + action}' {filenames}
pattern 表示 AWK 在数据中查找的内容,而 action 是在找到匹配内容时所执行的一系列命令
eg:执行 awk 时,它依次对/etc/passwd 中的每一行执行 print 命令。
[root@localhost ~]# awk -F: '{print $0}' /etc/passwd
常用 awk 内置变量
$0 当前记录
n 当前记录的第n个字段
FS 输入字段分割符 默认是空格
RS 输入记录分割符 默认为换行符
NF 当前记录中的字段个数,就是有多少列
NR 已经读出的记录数,就是行号,从1开始
OFS 输出字段分割符 默认也是空格
ORS 输出的记录分割符 默认为换行符
打印ip FS="[" “:]+” 以一个或多个空格或:分隔 NR=2 第二行 打印第三个字符串
[root@server1 ~]# ifconfig ens33 | awk -F[" ":]+ 'NR==2{print $3}'
192.168.211.100
awk正则
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-f9n7LoqA-1646021332450)(C:\Users\HP\AppData\Roaming\Typora\typora-user-images\image-20220228120257512.png)]
经读出的记录数,就是行号,从1开始
OFS 输出字段分割符 默认也是空格
ORS 输出的记录分割符 默认为换行符
打印ip FS="[" ":]+" 以一个或多个空格或:分隔 NR=2 第二行 打印第三个字符串
```bash
[root@server1 ~]# ifconfig ens33 | awk -F[" ":]+ 'NR==2{print $3}'
192.168.211.100
awk正则