linux文本三剑客详解

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或者good
5. 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
第一列
a
b
c
结束

示例:

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 test

3. 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 d


5. awk -v FS=':' -v OFS='---' '{print $1,$2}' demo  #OFS指定输出分隔符
 a---b
 c---d

6. awk -v RS=':' '{print $1,$2}' demo
 a
 b c
 d

7. awk -v FS=':' -v ORS='---' '{print $1,$2}' demo
a b---c d


8. awk '{print FILENAME}' demo1
demo1

9. awk 'BEGIN {print ARGC}' demo 
2
10. awk 'BEGIN {print ARGV[0]}' demo1 
awk
    awk 'BEGIN {print ARGV[1]}' demo1
demo1

       

内置变量

  • 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}' demo
mmm:a:b
mmm: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.比较操作符:

   ==, !=, >, >=, <, <=


  • 6
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值