shell文本处理三剑客

一、正则表达式 1、简介 正则表达式 (RE) 是一种字符模式,用于在查找过程中匹配指定的字符。大多数程序中,正则表达式置于两个正斜杠之间。 2、示例 判断用户输入的内容是否为数字:if [[ $num =~ ^[0-9]+$ ]] =~ 正则表达式匹配符 ^[0-9]:以0-9任意一个数开头 +

一、正则表达式

1、简介

正则表达式 (RE) 是一种字符模式,用于在查找过程中匹配指定的字符。大多数程序中,正则表达式置于两个正斜杠之间。

2、示例

判断用户输入的内容是否为数字:if [[ $num =~ ^[0-9]+$ ]]

=~ 正则表达式匹配符

^[0-9]:以0-9任意一个数开头

+$:以一个或多个数字结尾

3、元字符

(1) 简介:用一类字符表达特殊的含义。

(2) 基本正则表达式元字符

^  行首定位符

$  行尾定位符

.  匹配任意单个字符

*  匹配前导符 0 到多次 (c 出现 0 次 ~ 多次)

.*  匹配任意多个字符

[ ]  匹配指定范围内的一个字符

[-]  匹配连续范围内的字符 ( [a-z] )

[^]  匹配不在指定范围内的字符 ( [^a-z] )

\   转义元字符

\<  词首定位符 \>  词尾定义符

()  组字符,将匹配的部分作为一个整体

例   :1,5 s/\(.*\)/#\1/

s/ / /                sed 替换操作

\(.*\) (.*)          匹配所有的内容并作为一个整体,括号前加上 \ 转义

/#                   在匹配的内容前添加 #

\1 第一部分    每个 () 代表一个部分

x\{m\}     字符x出现m次

x\{m,\}    字符x出现m次及以上

x\{m,n\}  字符x出现m到n次

(3) 扩展正则表达式元字符

+匹配 1~n 个前导符
匹配 0~1 个前导符
a|b匹配 a 或 b

(4) 示例:

/^[A-Z]..$/ 以一个大写字母开头,两个任意字符结尾
/^[A-Z][a-z]*3[0-5]/A-Z开头;a-z 出现0或多次;跟一个3;结尾是数字 0-5
/^ *[A-Z][a-z][a-z]$/0到多个空格开头;跟一个大写两个小写
/^[A-Za-z]*[^,][A-Za-z]*$/以0到多个任意字母开头;不以, 开头;任意字母结尾
/5{2}2{3}\./5出现两次;2出现3次;跟一个点 .
/^[ \t]*$/搜索 0 到多个空格或 tab 的行
/^[ \t]*#/搜索 0 到多个空格或 tab 的注释行
:1,$ s/\([Oo]ccure\)ence/\1rence/

:1,$ 匹配1到末尾行

s/\([Oo]ccure\)ence/\1rence/ 在 Occure 或 occure 后面加上 rence

二、grep

1、作用:

查找文档中的内容

grep  查找的内容  查找位置1  查找位置2 …

2、种类

grep支持基本正则表达式元字符搜索
egrep支持扩展正则表达式元字符搜索
fgrep不支持正则表达式元字符搜索

3、返回值

返回 0找到结果
返回1没找到结果
返回2搜索的位置有错误

4、参数

-q静默搜索(不输出搜索结果)
-v取反搜索
-R查看目录下的文件
-o只找关键字
-B2显示搜索的内容及前两行
-A2显示搜索的内容及后两行
-C2显示搜索的内容及上下两行
-n显示行号

三、sed

1、简介

Stream EDitor:流编辑,用于从文本文件或标准输入流中读取文本,并根据用户指定的规则进行文本编辑和转换。

2、格式

① sed 选项 命令 文件

② sed 选项 -f 脚本 文件

3、返回值

sed 的返回值都是 0,无论对错;只有命令存在语法错误时,才为非 0

4、sed 命令

删除命令:d

① sed -r '/root/d' passwd:

-r:支持匹配正则表达式元字符

'/root/d':/匹配的内容/d 删除

passwd:查找的文件

文件本身没有被改变,需要加上 -i 选项才会修改文件内容:

② sed -r '数字d':删除第几行

例:sed -r '3d':删除第三行 ;'1,3d':删除 1~3 行 ;'$':删除尾行

替换命令:s

sed -r 's/root/aofa/' passwd:  默认只替换每行的第一个 root

sed -r 's/root/aofa/g' passwd: g → global 全局替换

sed -r 's/^root/aofa/' passwd: /^root/ → 替换以 root 为行首的行

sed -r 's/[0-9][0-9]$'/&.5/' passwdz:[0-9][0-9] 以两个数字结尾;&.5:调用前方匹配的内容,再加 0.5(10→10.5)

读文件命令:r

在当前文件中读取其他文件内容

sed -r '$r 1.txt' passwd:在末行读取 1.txt 的内容

不指定行则会在每一行都都读取 1.txt 的内容

写文件命令:w(另存为)

sed -r 'w 123.txt' 1.txt:把 1.txt 的内容存到 123.txt

追加命令:a(添加在行后);i(添加在行前)

sed -r '2a123' passwd:在 passwd 第二行后添加123

插入多行:用 \ 转义回车

替换整行命令:c

sed -r '2caaaaaa' passwd:把第二行换成 aaaaaa

获取下一行命令:n

反向选择:!

sed -r '2,$!d' passwd:2到最后一行之外的部分删除

多重编辑:e

在一条命令中发布多条指令

sed -r -e '1,3d' -e '4s/adm/admin/g' passwd

四、awk

1、awk 工作原理

逐行处理文件,寻找匹配了特定模式的行,并进行相应操作。

awk 将每行赋值给内部变量 $0,再将一行里的每一个字段依次赋值给$1、$2… 处理完一行后再接着处理下一行。

-F: 将冒号作为分隔符

2、语法

awk 选项 '命令' 文件名

awk 命令:

BEGIN{ }:行处理前

{ }:行处理时,读一行执行一行

END{ }:行处理后

3、awk 内部变量

FS输入字段分隔符,默认空格,-F的另一种写法

awk  'BEGIN{FS=":"} {print $1}'  passwd

OFS:输出字段分隔符,默认空格

awk  'BEGIN{FS=":";OFS="++"} {print $1,$2,$3}'  passwd

RS:输入记录分隔符,默认是换行符

awk  'BEGIN{RS=" "} {print $0}'  1.txt

将空格作为记录分隔,而不是回车

ORS:输出记录分隔符,默认是换行符

awk  'BEGIN{ORS="++"}  {print $0}'  1.txt

输出的记录以++作为分隔

FNR:多文件独立编号

NR:多文件汇总编号

NF:统计字段总数

awk  '{print NF,$0}'  1.txt

4、模式(正则表达)和动作

模式可以是任何条件语句或复合语句或正则表达式,模式决定动作语句何时触发及触发事件。

(1) 字符串比较

awk  '$0 ~ /^root/'  passwd:像以 root 开头的字段

(2) 数值比较

awk  -F:  '$3 > 10'  passwd:$3 字段大于 10 的行

== 既可以用于数值比较,也可以用于字符串判断。

(3) 运算

+ - * / % ^

awk  -F:  '$3*2 > 5'  passwd

(4) 逻辑操作符和复合模式

&&:逻辑与 ; || :逻辑或 ; !逻辑非

(5) 范围模式

语法:awk  '/从哪里/, /到哪里/'  文件名

五、awk 脚本编程

1、条件判断

(1) if 语句

格式:{ if (表达式) {语句1;语句2;…} }

示例:判断用户 id 是否为 0

awk  -F:  '{if($3==0){print $1"是管理员"}}'  passwd

(2) if … else 语句

格式:{ if (表达式) {语句1;语句2;…} else {语句1;语句2;…} }

awk  -F:  '{if($3==0){print $1"是管理员"} else {print $1"是普 通用户"}'  passwd

(3) 多分支语句

示例:显示三种用户的信息(管理员 id=0、内置用户 id<1000、普通用户 id>999)

awk  -F:  '{ if($3==0){num1++} else if($3>999){num3++} else {num2++}} END{print num1;print num2;print num3}'  /etc/passwd

2、循环

while、for

循环打印 1~10

awk  'BEGIN{while(i<=10) {print i;i++} }'

awk  'BEGIN{for(i=1;i<=10;i++) {print i} }'

3、数组

awk  -F:  '{username[i++]=$1}END{for(i in username){print i, username[i]}}'  passwd | sort

把用户名添加进数组,再通过 for 循环打印出用户名

知秋君
上一篇 2024-07-12 09:12
下一篇 2024-07-12 08:48

相关推荐