跨境派

跨境派

跨境派,专注跨境行业新闻资讯、跨境电商知识分享!

当前位置:首页 > 卖家故事 > linux文本三剑客详解

linux文本三剑客详解

时间:2024-04-18 16:40:22 来源:网络cs 作者:焦糖 栏目:卖家故事 阅读:

标签: 文本 
阅读本书更多章节>>>>

awk、grep、sed是linux操作文本的三大利器,合称文本三剑客。

特点:

grep——单纯的查找或匹配文本。

sed——编辑匹配到的文本。

awk——格式化文本,对文本进行较复杂格式处理。

首先了解一下正则表达式:

匹配字符

. 任意单个字符[] 指定范围的字符[^] 不在指定范围的字符次数匹配:* :匹配前面字符任意次? : 0 或1次+ :1 次或多次{m} :匹配m次 次{m,n} :至少m ,至多n次

 配置次数

* 匹配前面的字符任意次,包括0次,贪婪模式:尽可能长的匹配.* 任意前面长度的任意字符,不包括0次\? 匹配其前面的字符0 或 1次+ 匹配其前面的字符至少1次{n} 匹配前面的字符n次{m,n} 匹配前面的字符至少m 次,至多n次{,n} 匹配前面的字符至多n次{n,} 匹配前面的字符至少n次

 位置锚定:定位出现的位置

^ : 行首$ : 行尾<, \b : 语首>, \b : 语尾分组:()后向引用:\1, \2, ...

 

实例介绍:

grep

Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来 。grep也可用于shell脚本,因为grep通过返回一个状态值来说明搜索的状态,如果模板搜索成功,则返回0,如果搜索不成功,则返回1,如果搜索的文件不存在,则返回2。

语法:

grep [options] [pattern] file命令   参数     匹配模式 文件数据-i : Linux大小写敏感,忽略字符大小写-o : 仅显示匹配的字符串本身-v : 显示没有被匹配的行-E :支持使用扩展的正则表达式元字符-q : 静默模式,不输出任何信息-n : 显示行号-F : 相当于fgrep,匹配固定字符串的内容。

fgrep : 为固定字符串全局正则表达式打印fgrep(与grep -F相同)是固定的或快速的grep,其行为与grep相同,但不会将任何正则表达式元字符识别为特殊的。搜索将更快完成,因为它只处理简单的字符串而不是复杂的模式。

实例:

1. grep '^a' test.txt -i -n    #查找以a开头的行,显示行号并且忽略大小写。        'a$'                   #查找以a结尾的行        'a*'                   #查找a出现一次或者多次行号      2. grep -v '^$' test.txt       #反向输出所有非空格内容(过滤空行)3. grep "\.$" test.txt -n      #输出以.为结束的行,\为转义字符,.为特殊字符。        '^.*c'                 #以任意内容开头, 直到c结束4. grep "[abc]" test.txt -n -o #匹配abc字符中的任意一个,得到它的行数和行号,只显示被匹配的关键字。        "[^a]"           -c    #匹配除a以外的字符,显示被匹配了多少行。        "[a+]"           -n    #+号表示匹配前一个字符1一次或多次.        "[go?d]"         -n    #匹配god或者good5. grep -E "(ab)+c" test.txt -n   #匹配ab出现一次或者多次以c结尾的行,并显示行号。         "go(|o|od)d"             #|或的意思,()将一个或多个字符捆绑一起, 当作一个整体进行处理。         "(ab){1,3}"              #匹配ab字符一到三次。

sed

 sed 是一种流编辑器,它一次处理一内容。

  处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(patternspace ),

  接着用sed 命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。

  然后读入下行,执行下一个循环。

  如果没有使诸如‘D’ 的特殊命令,那会在两个循环之间清空模式空间,但不会清空保留空间

  这样不断重复,直到文件末尾。

  文件内容并没有改变,除非你使用重定向存储输出或-i

  功能:主要用来自动编辑一个或多个文件, 简化对文件的反复操作

 语法: sed` `[options] ``'[地址定界] command'` `file``(s)

 常用的option:

-n :不输出模式空间内容到屏幕,即不自动打印,只打印匹配到的行-e :多点编辑,对每行处理时,可以有多个Script-f :把Script写到文件当中,在执行sed时-f 指定文件路径,如果是多个Script,换行写-r :支持扩展的正则表达式-i :直接将处理的结果写入文件-i.bak :在将处理的结果写入文件之前备份一份 

地址定界:

不给地址:对全文进行处理单地址:   \#: 指定的行   /pattern/:被此处模式所能够匹配到的每一行地址范围:   \#,#   \#,+#   /pat1/,/pat2/   \#,/pat1/~:步进   sed -n '1~2p' 只打印奇数行 (1~2 从第1行,一次加2行)   sed -n '2~2p' 只打印偶数行

command:

d:删除模式空间匹配的行,并立即启用下一轮循环p:打印当前模式空间内容,追加到默认输出之后a:在指定行后面追加文本,支持使用\n实现多行追加i:在行前面插入文本,支持使用\n实现多行追加c:替换行为单行或多行文本,支持使用\n实现多行追加w:保存模式匹配的行至指定文件r:读取指定文件的文本至模式空间中匹配到的行后=:为模式空间中的行打印行号!:模式空间中匹配行取反处理加g表示行内全局替换;  在替换时,可以加一下命令,实现大小写转换  \l:把下个字符转换成小写。  \L:把replacement字母转换成小写,直到\U或\E出现。  \u:把下个字符转换成大写。  \U:把replacement字母转换成大写,直到\L或\E出现。  \E:停止以\L或\U开始的大小写转换

实例:

1. sed -n '5,19 p' demo           #查看文件demo中5-19行中的内容。2. sed -n '/^a/ p' demo          #查看以a开头的demo文件的行。3. sed '2,3 d' demo | head        #将2-5行内容打印出来。4. sed -e '4 a\abc' demo | head  #在文件passwd上的第四行后面添加abc.5. sed '2 i\abc' demo | head     #在第二行前插入abc.6. sed '3 c\abc' demo |head      #将第三行替换为abc.7. sed -n '5,10 s/bin/aaaa/ p' demo |head   #将passwd的5到10的bin字符串查找出来替换为aaaa。8. sed -i '1 d' demo             #删除原文件的第一行。9. sed -i.bak '1 d' demo         #备份

awk

awk是一种编程语言,用于在linux/unix下对文本和数据进行处理。

数据可以来自标准输入(stdin)、一个或多个文件,或其它命令的输出。

支持用户自定义函数和动态正则表达式等先进功能,是linux/unix下的一个强大编程工具。

awk有很多内建的功能,比如数组、函数等,这是它和C语言的相同之处,灵活性是awk最大的优势。

语法:

awk ‘BEGIN {commands} pattern {commands}END{commands}' file1

BEGIN:处理数据前执行的命令

END:处理数据后执行的命令

pattern:模式,每一行都执行的命令

BEGIN和END里的命令只是执行一次

pattern里的命令会匹配每一行去处理

awk -F: 'BEGIN{print "第一列"}{print $1} END{print "结束"}' awkdemo第一列abc结束

示例:

1. awk -F ":" '{print $1,$2,$5}' /etc/passwd | head     -F ":"  :  awk选项,指定输入分割符为:    '{print}'    : 固定语法    $1,$2,$5  :输出第一个,第二个,第五个字段     : 是输出分隔符,如果不加默认是没有分隔符的。2. echo 'this is a test' | awk '{print $0}'   this is a test3. echo 'this is a test' | awk '{print $NF}'  test                         #$NF表示最后一个字段,$(NF-1)表示倒数第二个字段。4. cat awkdemo a:b c:d awk -v FS=':' '{print $1,$2}' demo  #FS指定输入分隔符 a b c d5. awk -v FS=':' -v OFS='---' '{print $1,$2}' demo  #OFS指定输出分隔符 a---b c---d6. awk -v RS=':' '{print $1,$2}' demo a b c d7. awk -v FS=':' -v ORS='---' '{print $1,$2}' demoa b---c d8. awk '{print FILENAME}' demo1demo19. awk 'BEGIN {print ARGC}' demo 210. awk 'BEGIN {print ARGV[0]}' demo1 awk    awk 'BEGIN {print ARGV[1]}' demo1demo1       

内置变量

FS :输入字段分隔符,默认为空白字符

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

RS :输入记录分隔符,指定输入时的换行符,原换行符仍有效

ORS :输出记录分隔符,输出时用指定符号代替换行符

NF :字段数量,共有多少字段, $NF引用最后一列,$(NF-1)引用倒数第2列

NR :行号,后可跟多个文件,第二个文件行号继续从第一个文件最后行号开始

FNR :各文件分别计数, 行号,后跟一个文件和NR一样,跟多个文件,第二个文件行号从1开始

FILENAME :当前文件名

ARGC :命令行参数的个数

ARGV :数组,保存的是命令行所给定的各参数,查看参数

自定义变量:-v var=value

awk -v name="mmm" -F: '{print name":"$0}' demommm:a:bmmm:c:d

内置函数,方便对原始数据的处理。

$ awk -F ':' '{ print toupper($1) }' demo.txt

 

tolower():字符转为小写。

length():返回字符串长度。

substr():返回子字符串。

sin():正弦。

cos():余弦。

sqrt():平方根。

rand():随机数。

awk -F ':' '/usr/ {print $1}' demo.txt#print命令前面是一个正则表达式,只输出包含usr的行。
awk -F ':' 'NR % 2 == 1 {print $1}' demo.txt#输出奇数行
 awk -F ':' 'NR >3 {print $1}' demo.txt #输出第三行后的行
 awk -F ':' '$1 == "root" {print $1}' demo.txt​ awk -F ':' '$1 == "root" || $1 == "bin" {print $1}' demo.txt  #输出第一个字段等于指定值的行。
awk -F ':' '{if ($1 > "m") print $1; else print "---"}' demo.txt#使用if语句

操作符:

1. df -h |awk -F: '$0 ~ /^\/dev/' /dev/mapper/cl-root#查询以/dev开头的磁盘信息模式匹配符:~ :左边是否和右边匹配包含            !~ :是否不匹配2. awk -F: '$3>=0 && $3<=10 {print $1,$3}' /aaa 3. awk -F: '$3==0 || $3>=10 {print $1}' /aaa   其他操作符1.算术操作符:   x+y, x-y, x*y, x/y, x^y, x%y   -x:  转换为负数   +x:  转换为数值2.赋值操作符:   =, +=, -=, *=, /=, %=, ^=, ++, --3.比较操作符:   ==, !=, >, >=, <, <=

阅读本书更多章节>>>>

本文链接:https://www.kjpai.cn/gushi/2024-04-18/160106.html,文章来源:网络cs,作者:焦糖,版权归作者所有,如需转载请注明来源和作者,否则将追究法律责任!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。

文章评论