1. Bash中常用正则表达式
^行首标识符 ^str => 以str开头的行
$行尾标识符 str$ => 以str结尾的行
^$ => 空白行
\ 转义字符
数量标识符
* => 个数>=0
+ => 个数>=1
? => 个数 in [0,1]
\{x,y\} => 个数 [x,y]
逻辑标识符
|或
字符串表示符
()
2. grep-bash中的like
作用: 根据指定规则扫描文件,并打印符合规则的行
格式: grep -参数 'str' [stdin|file](多个文件空格分隔)
参数: -v 反向匹配 打印没有匹配到指定字符串的行
-n 输出的同时打印行号
-i 忽略大小写
-c 只打印包含指定内容行的行数
-r 指定查找的是目录,会将该目录下所有的文件都作为查询对象
-E 相当于egrep 可以使用 逻辑标识符、数量标识符
示例:
1.查询指定目录下中文件包含某个字符串的文件
[root@gaocun user]# grep -r '[123]' ./
./demo:1
./demo:2
2.定位空白行
[root@gaocun user]# grep -n '^$' demo
11:
12:
3. egrep(延伸正则表达式)、grep -E、grep的区别
区别:
egrep、grep -E使用 逻辑标识符、数量标识符时,不用转义
grep 使用 逻辑标识符、数量标识符时,需要转义
作用: 同 grep -E
示例:
1.匹配 包含aaa的行
echo "aaa#bbb#ccc" | grep -E 'a{2}'
echo "aaa#bbb#ccc" | egrep 'a{2}'
echo "aaa#bbb#ccc" | grep 'a\{2\}' #不用-E参数时,需要对标识符转义
4.sed (Bash对文本的增删改查)
4.1 参数说明
作用: 根据指定规则修改文本内容(替换、删除)
目标源参数:
-e(默认值) 将指定的文件复制到内存,并不会对原文件进行修改,可以处理 stdin和file
-i 直接修改文件内容而不是打印,只能处理file
-n 只打印被处理的行的内容 常用动作参数 -p 打印 一起使用
-r 在脚本中使用扩展正则表达式
动作参数:
行号a var: 行后插入
行号i var: 行前插入
行号x,yc var: x到y行内容 被var替换
行号x,yd var: x到y行内容 被删除
行号x,yp var: x到y行内容 被打印
/var/p var: 包含var的行被打印
s/old/new/ : 替换第一次出现的old
s/old/new/g : 替换全局出现的old
标识符:
$行尾表示标识符
4.2 sed -e '动作参数' [stdin|file]
方式1: 根据 行号处理文本
#删除
’x,yd‘ --删除指定行,并打印处理后的文件内容
sed '1,2d' demo #删除 1到2行 内容
sed '3,$d' demo #删除 3到最后行 内容
#行后插入
'[RowNumber]a NewRowString' --在指定行后追加新行,并打印处理后的文件内容
sed '1a newRow' demo #在1行后添加 newRow
sed '1a newRow1\newRow1' demo #在1行后添加 2行内容
#行前插入
’[RowNumber]i NewRowString‘ --在指定行前插入新行,并打印处理后的文件内容
sed '1i newRow' demo #在1行前添加 newRow
#替换
'x,yc NewRowString' --指定行数内容替换新内容,并打印处理后的文件内容
sed '1,3c newRow' demo #将1,3行内容替换为newRow
方式2: 根据 文本内容处理文本
's/旧内容/新内容/g'--将匹配到的旧内容替换为新内容,并打印处理后的文件内容
sed 's/[0-9]\+/@/g' demo #将多个数字字符替换成@(仅替换首次)
sed 's/[0-9]\+/@/' demo #将多个数字字符替换成@(全局替换)
4.3 sed -i '动作参数' [file] (慎用,会直接修改文件)
方式1: 根据 文本行号处理文本
’x,yd‘ --删除指定行,修改目标文件
sed -i '1,2d' demo #删除1,2行内容
'[RowNumber]a NewRowString' --在指定行后追加新行,修改目标文件
sed -i '1a newRow' demo #在1行后添加 newRow
’[RowNumber]i NewRowString‘ --在指定行前插入新行,修改目标文件
sed -i '1i newRow' demo #在1行前添加 newRow
'x,yc NewRowString' --指定行数内容替换新内容,修改目标文件
sed -i '1,3c newRow' demo #将1,3行内容替换为newRow
方式2: 根据 文本内容处理文本
's/旧内容/新内容/g'--将匹配到的旧内容替换为新内容,修改目标文件
sed -i 's/[0-9]\+/@/g' demo #将多个数字字符替换成@
4.4 sed -n '动作参数'
'x,yp' --显示 x到y行内容
sed -n '1,3p' demo #打印 1到3行内容
'/var/p' --显示 包含var的行
sed -n '/@/p' demo #打印 包含@的行
4.5 最佳实践-匹配到 ip addr命令中的ip
1.匹配到 ip addr命令中的ip
[root@gaocun user]# ip addr | grep 'inet.*brd' | sed 's/\/.*//g' | sed 's/.* //g'
10.0.24.10
4.6 最佳实践-多点编辑
[root@gaocun user]# sed -e '1,3s/[0-9]/@/g' -e '6,$s/[0-9]/#/g' demo
@
@
@
4
5
#
#
#
#
5. printf(格式化并打印数据)
格式: printf "指定格式" data1 data2
格式替换符 :
%s - 字符串
%c - 字符
%d - 整数
%f - 浮点
%-5s
- 左对齐(不指定时为右对齐)
5 任何字符串都内容都会被5个字符宽度显示,字符串不足5字符时会被空格符填充
%4.2f - 保留2位小数
示例:
printf "%-10s %-8s %-4s\n" 姓名 性别 体重kg
printf "%-10s %-8s %-4.2f\n" 郭靖 男 66.1234
printf "%-10s %-8s %-4.2f\n" 杨过 男 48.6543
printf "%-10s %-8s %-4.2f\n" 郭芙 女 47.9876
-- 结果
姓名 性别 体重kg
郭靖 男 66.12
杨过 男 48.65
郭芙 女 47.99
6. awk
6.1 基础
用途: 按照指定分隔符(默认为空格、\t)对文本进行分割,行分割符为\n,返回一个数组
并对元素进行操作
格式:
awk -参数 '过滤条件 {操作动作 操作变量}' [stdin|file]
参数:
-F指定分隔符
-v设置变量
操作动作:
print 打印结尾添加\n
printf 打印结尾不加\n
操作变量:
$1 : 数组的第1个元素
$2 : 数组的第2个元素
$3 : 数组的第3个元素
$0 : 整行数据
var : 自定义变量 -vVarName=value
NF : 每行的元素个数
NR : 当前行的行号
FS : 字符分隔符
FILENAME : 当前文件名
6.2 关于操作变量
#数组元素变量
echo "大王 小王 gao cun" |awk '{print \
"arr1:"$1 \
"\narr2:"$2 \
"\narr2:"$3 \
"\narr:"$0 \
}'
#执行结果
arr1:大王
arr2:小王
arr2:gao
arr:大王 小王 gao cun
#自定义变量
方式1:
echo "大王 小王 gao cun" |awk -vname=玫瑰 '{print $1,name,$2}'
大王 玫瑰 小王
方式2:
echo "大王 小王 gao cun" |awk '{name="玫瑰"} {print $1,name,$2}'
大王 玫瑰 小王
#系统内置变量
echo "大王 小王 gao cun" |awk '{print \
"每行的元素个数:" NF \
"\n当前行的行号:" NR \
"\n字符分隔符:" FS \
"\n当前文件名:" FILENAME \
}'
6.3 每行按指定字符分割,并打印分割后的元素
#默认分隔符 空格或\t
echo "大王 小王 gao cun" |awk '{print $1,$2,$3,$4}'
大王 小王 gao cun
#指定单个分隔符
echo "大王#小王#gao@cun" |awk -F# '{print $1,$2,$3,$4}'
大王 小王 gao@cun
#指定多个分隔符
echo "大王#小王#gao@cun" |awk -F[#@] '{print $1,$2,$3,$4}'
大王 小王 gao cun
6.4 运算符的使用
#过滤第一列的值>2的行
awk '$1>2' demo
#过滤第一列的值=2的行
awk '$1==2 {printf $0}' demo
#过滤第一列的值=2或第二列的值=g的行
awk '$1==2 || $2==g {printf $0}' demo
6.5 正则表达式的使用
#过滤第一列包含数字的行
awk '$1 ~ /[0-9]/' demo
~ 表示 模式开始(默认值)
// 表示 模式内容
#模式取反
awk '$1 !~ /[0-9]/' demo
awk '!/[0-9]/' demo
6.6 关于awk脚本(没用过,用的时候在补充)
#关键词
BEGIN{ 这里面放的是执行前的语句 }
END {这里面放的是处理完所有的行后要执行的语句 }
{这里面放的是处理每一行时要执行的语句}
6.7 关于set、awk、grep 更适用哪些场景
grep 更适合单纯的查找或匹配文本
sed 更适合编辑匹配到的文本
awk 更适合格式化文本,对文本进行较复杂格式处理
7.diff、cmp、patch(对比文件的差异)
7.1 diff
#diff
功能: 逐行比较文本文件的差异
参数:
-y side-by-sid 并排模式
-W 指定宽度
-b 忽略一行当中空白的差异
-B 忽略空白行的差异
-i 忽略大小写的差异
示例1: 比较两个文件(只打印差异内容)
[root@gaocun user]# diff demo demo1
0a1
> 1 a
2d2
< 3 c
示例2: 并排格式输出(打印所有内容)
[root@gaocun user]# diff demo demo1 -y -W 30
hahaha | 1 a
2 b 2 b
3 c <
4 d 4 d
5 e 5 e
6 f 6 f
7 h 7 h
8 g 8 g
9 i 9 i
| 表示 同行号内容由差异
< 表示 文件2比文件1少一行
> 表示 文件2比文件1多一行
7.2 cmp
#cmp
功能: 对比两个文件字节的不同
[root@gaocun user]# cmp demo demo1
demo demo1 不同:第 1 字节,第 1 行
7.3 patch
#patch
功能: 将差异打补丁
#制作补丁(认为demo1为目标文件,将差异打在demo.patch中)
diff -Naur demo demo1 > demo.patch
#更新补丁(用补丁去更新demo,更新完后demo和demo1完全相同)
patch -p0 demo < demo.patch
#还原补丁(还原更新后的demo)
patch -R -p0 demo < demo.patch
8. pr 打开文件-显示打开时间-档案名-页码
[root@gaocun user]# pr demo
2022-05-08 15:25 demo 第 1 页
hahaha