ubl007
作者ubl007·2023-09-25 10:03
私有云高级交付(DTA方向)·百度智能云

shell程序中操作文档常见的正规表达式

字数 6069阅读 463评论 0赞 1

原来准备以专题性培训教材给同事们学习和使用的,不过现在用不上了,开放出来了.......


1 #取反b到g区间的字母,即不匹配 字母 b/c/d/e/f/g

2 * # 取反 “awk ”,即 不取值 “awk”

例如:取出以a到h之间的小写字母开头且后缀名不是“awk”的文件名

ls -Fhlart /home/Document/[a-h].2

{} 内的表达式之间是“或”关系,表达式之间用“,”隔开

例如:列出匹配 [a-h].2 或0?.pem[a-h].2 的全部文件

ls -Fhlart /home/Document/{[a-h].2,[a-h].2}

grep 中的空白行为 ^$

grep 中的非空白行为 ^3

grep中的精确匹配为 “\\<内容\\>”

grep中的“或”为 “内容1|内容2”

调用 sed命令的方式:

一 sed [SED选项] ‘SED命令’ 被操作文件

二 sed [SED选项] -f SED脚本文件 被操作文件

三 ./SED脚本文件 被操作文件

sed命令的组成构件:

行定位 + 编辑命令

注意:编辑命令即可放到单引号内,也可放到单引号外。推荐统一放到单引号外。

sed中行定位方式:一是使用行号;二是使用正规表达式;三是使用匹配模式指定关键字。

sed -n '1p' 被操作文件 # 仅仅打印第1行

sed -n '3,6p' 被操作文件 # 仅仅打印第3到6行

sed -n ‘/certificate/p’ 被操作文件 # 仅仅打印匹配关键字“certificate”的行内容

sed -n ‘/certificate/=’ 被操作文件 # 仅仅打印匹配关键字“certificate”的行号

SED的选项“-e” 表示将紧接着的字符串解析为编辑命令。也就是说需要使用多个编辑命令是可以使用选项“-e”。{}符号和;符号也有类似的功效。

sed -n -e ‘/certificate/p’ -e ‘/certificate/p’ 被操作文件 #仅仅打印匹配关键字“certificate”的行内容及对应的行号

sed -n ‘/certificate/{p;=}’ 被操作文件 #仅仅打印匹配关键字“certificate”的行内容及对应的行号

sed ‘/certificate/{s/i/I/g;s/le/99/}’ 被操作文件 #将匹配关键字“certificate”的行中的i替换为I,将首个le替换为99

sed ‘/certificate/{n;s/ll/66/}’ 被操作文件 #将匹配关键字“certificate”的行的下一行的首个ll替换为66。编辑命令n的含义是读取下一行

sed ‘s/glo/GLO/;s/seu/SEU/’ 被操作文件 #将匹首个glo替换为GLO,将首个seu替换为 SEU

sed ‘/file:/a\\We append a new line.’ 被操作文件 # 在匹配关键字“file:”的行后追加一行内容“We append a new line.”

SED的选项“-f”用于调用SED的脚本文件。

sed -n ‘/\\./p’ 被操作文件 #仅仅打印匹配“.”的行。注意:“.”属于元字符,因此在“.”前使用了脱意符“\\”使其仅表示普通字符。

sed -n '$p' 被操作文件 # 仅仅打印最后一行内容

sed -n '/.*bus/p' 被操作文件 # 仅仅打印以“bus”结尾的字符串所在行的内容

sed -n '2,10!p' 被操作文件 # 打印除第2到10行外的内容

sed -n '2,/seugrid/p' 被操作文件 # 打印第2行到匹配关键字“seugrid”所在行的内容

sed '/file:/i\\We insert a new line.'被操作文件 # 在关键字“file:” 所在的行前插入一行内容“We insert a new line.”

sed '/file:/c\\We modify this line.'被操作文件 # 将在关键字“file:” 所在的行内容替换为“We modify this line.”

sed '$d' 被操作文件 # 删除最后一行内容

sed '1d' 被操作文件 # 删除第1一行内容

sed '1,10d' 被操作文件 # 删除第1到10行内容

sed '/Bb[Yy]/d' 被操作文件 # 删除关键字“BUY”所在的行,关键字“BUY”的字母不区分大小写

sed -n 's/BUY/buy/p' 被操作文件 # 使用编辑命令s将每行中首个遇到的BUY替换为buy,并打印对应的行内容

sed -n 's/SEO/buy/3p' 被操作文件 # 使用编辑命令s将每行中第3个遇到的SEO替换为buy,并打印对应的行内容

sed -n 's/SEO/buy/w 输出文件' 被操作文件 # 使用编辑命令s将每行中第首个遇到的SEO替换为buy,并重新写入到输出文件中

&符号用于保存被操作的字符串,如下的两条命令是等价的:

sed -n 's/SEO/(SEO)/p' 被操作文件 # 使用编辑命s将每行中首个遇到的“SEO”替换为“(SEO)”,并打印对应的行内容

sed -n 's/SEO/(&)/p' 被操作文件 # 使用编辑命s将每行中首个遇到的“SEO”替换为“(SEO)”,并打印对应的行内容

sed -n '/SEO/w 输出文件' 被操作文件 # 将匹配SEO的行写入到输出文件中

sed '/SEO/r 文本文件' 被操作文件 # 在匹配SEO的行后追加上文本文件中的内容

sed -n '/.r.*/p' 被操作文件 # 打印出匹配“任意字符后紧跟r,r后再跟任意个字符”的字符串所在行的内容

sed -n '/.r.*/q' 被操作文件 # 打印出匹配“任意字符后紧跟r,r后再跟任意个字符”的字符串所在首个行的内容

sed 'y/12345/ABCDE/' 被操作文件 # 将序列12345变更为序列 ABCDE,即1变为A,2变为B,3变为C,4变为D,5变为E

sed -n '1,$l' 被操作文件 # 打印出被操作文件中的控制字符,命令等同于 cat -A 被操作文件

AWK的3中调用方式:

方式一 awk [-F 分割符号] ‘AWK程序片段’ 被操作文件

方式二 awk -f AWK脚本文件 被操作文件

方式三 ./AWK 脚本文件 被操作文件

AWK语句由定位条件和动作两部分构成。

awk '/^$/ {print "A Blank Line."}' 被操作文件 #定位到文件中的就白航时打印语句“A Blank Line.”。正规表达式“^$”表示空白行。

AWK将被操作文件定义为结构化文件:横行纵域,域之间用空格登进行分隔。“$”称作域操作符,用来标识域的位置。

awk '{print $2,$1,$4,$3}' 被操作文件 #依次打印第2、1、4、3列

awk '{print $0}' 被操作文件 #依次打印全部的列

awk -F "\\t" '{print $3}' 被操作文件 #以TAB键为分隔符打印第3列

awk 'BEGIN {one=1;two=2} {print $(one+two)}' 被操作文件 #打印第3列

awk 'BEGIN {FS=","} {print $(one+two)}' 被操作文件 #以,为分隔符打印第3列

awk 'BEGIN {FS=":"} $1~/root/' 被操作文件 #以:为分隔符,匹配第1列中含有“root”的行

awk 'BEGIN {FS=":"} $0~/root/' 被操作文件 #以:为分隔符,匹配全部列中含有“root”的行

awk 'BEGIN {FS=":"} $1!~/nologin/' 被操作文件 #以:为分隔符,匹配全部列中不含有“nologin”的行

awk 'BEGIN {FS=":"} {if($3&lt;$4) print $0}' 被操作文件 #以:为分隔符,打印第3列小于第4列的行

awk 'BEGIN {FS=":"} {if($3==10||$4==10) print $0}' 被操作文件 #以:为分隔符,打印第3列为10或第4列为10的行

awk 'BEGIN {FS=":"} {if($3~10||$4~10) print $0}' 被操作文件 #以:为分隔符,打印第3列包含10或第4列包含10的行

awk '/^$/ {print x++}' 被操作文件 #

awk '/^$/ {print ++x}' 被操作文件 #

awk 'BEGINE {FS=","} {print NF,NR,$0} END {print FILENAME}' 被操作文件 #以,为分隔符依次打印出列数、行号、全部内容,最后再打印出文件名

AWK输出报表需使用 printf 语句。

printf语句中的格式控制符描述了某种格式规范,以符号%开始。

awk 'BEGINE {FS=“,”} {printf("%s\\t%d\\n",$2,$3)}' 被操作文件 #以,为分隔符取出第2列和第3列的值,第2列格式化为字符串、第3列格式化为整数,二者之间使用TAB键分割开并进行换行

awk 'BEGINE {FS=“,”;print "姓名\\t\\t联系电话"} {printf("%-15s\\t%s\\n",$2,$3)}' 被操作文件 #以,为分隔符取出第2列和第3列的值并格式化为字符串,其中第2列的字符串长度为15,并打印出报表抬头“姓名 联系电话”的字样

awk 'BEGIN {FS=":";OFS=":"} gsub(/root/,"gsp") {print $0}' 被操作文件 #以:为输入分隔符、以:为输出分隔符,将匹配“root”的列所在行中的“root”更换为“gsp”并打印出来

awk 'BEGIN {FS=":";OFS=":"} gsub(/root/,"gsp",$1) {print $0}' 被操作文件 #以:为输入分隔符、以:为输出分隔符,将第1列中匹配“root”的所在行中的“root”更换为“gsp”并打印出来

awk 'BEGIN {print index("walker","e")}' 被操作文件 #输出字符e在字符串walker中的首次出现位置

awk 'BEGIN {print length("walker")}' 被操作文件 #输出字符串walker的长度

awk 'BEGIN {print match("walker",/L/)}' 被操作文件 #以区分大小写的方式确认字符L是否存在于字符串walker中

awk 'BEGIN {IGNORECASE=1;print match("walker",/L/)}' 被操作文件 #以不区分大小写的方式确认字符L是否存在于字符串walker中

awk 'BEGIN {str="googleapps appsgaming";sub(/app/,"APP",str);printf("%s\\n",str)}' 被操作文件 #通过函数sub()将变量str中的首个app更改为APP,并将更换结果格式化成字符串打印出来

awk 'BEGIN {FS=","} {$1~Li sub(/10/,"99",$0);print $0}' 被操作文件 #以,为分隔符找出全文本中第1列中含有“Li”的行,通过函数sub()将目标行中的首个“10”变更为“99”,并打印出更改后的全文件内容

awk 'BEGIN {str="googleapps appsgaming";print substr(str,6)}' 被操作文件 #打印出变量str中从第6个字符开始后的字符部分

awk 'BEGIN {str="googleapps appsgaming";print substr(str,6,9)}' 被操作文件 #打印出变量str中从第6个字符开始、长度为9的字符部分

sort命令默认根据第1列对行记录进行排序,默认使用空格作为列分隔符,可以用 “-t”指定分隔符、用“-k”指定排序基准列(字符串顺序)。

sort -t : 被操作文件 #以:为分隔符对文本的行记录进行默认排序

sort -t : -k 3 被操作文件 #以:为分隔符、以第3列为排序基准(字符串顺序)对文本的行记录进行排序

“-n”表示按照数字大小进行升序排列,一般不单独使用,二是紧跟在列号之后。

sort -t : -k3n 被操作文件 #以:为分隔符、以第3列为排序基准(数字大小)对文本的行记录进行排序

“-r”表示将结果逆序显示

sort -t : -k3nr 被操作文件 #以:为分隔符、以第3列为排序基准(数字大小)对文本的行记录进行排序并逆序显示

“-u”用于去除重复的行记录

sort -t : -u 被操作文件 #以:为分隔符对文本的行记录进行默认排序,并去除重复的行记录

“-o”用于将排序结果另存为新文件

sort -t : -k3nr -o 另存文件 被操作文件 #以:为分隔符、以第3列为排序基准(数字大小)对文本的行记录进行排序并逆序显示,而后另存为新文件

“-m”用于把两个按照统一标准排好序的文本合并成一个文本

sort -t : -m 被操作文件1 被操作文件2 #以:为分隔符对排好序的文本1和文本2进行合并

join用于把两个含有相同一列内容的、已按照内容相同列排好序的文件链接起来。

“-v” 选项只显示文件中未进行链接的行记录。

“-a” 选项既显示文件中的链接行记录、又显示文件中未进行链接的行记录。

“-o” 选项用于执行显示哪些列、及按照什么顺序显示指定的列。

join -t: -o 1.1 2.2 1.3 文件1 文件2 #以:为列分隔符,依次显示文件1的第1列、文件2的第2列、文件1的第1列

“-1” 选项用于设定文件1中用于链接的列。

“-2” 选项用于设定文件2中用于链接的列。

join -t : -i -1 2 -2 1 文件1 文件2 #以:为列分隔符、以不区分大小写的方式将文件1的第2列与文件2的第1列进行链接

paste用于将两个文本的内容粘贴到一起。

“-d” 选项用于设置输出文件的分隔符,意义在于设置输出文件格式。

“-s” 选项用于将整个文件的内容放到一行进行粘贴。

split 用于分割文件。

split -2 被分割文件 分割后的文件前缀 #将被分割文件没2行做一次切割,输出的文件以某个前缀命名

“-b” 选项指定字节数分割文件数不考虑行记录的完整性。

“-C” 选项指定字节数分割文件数维持行记录的完整性。


  1. b-g
  2. awk
  3. $

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

1

添加新评论0 条评论

Ctrl+Enter 发表

作者其他文章

相关文章

相关问题

相关资料

X社区推广