Linux 常用命令sed/awk/grep及正则表达式

linux命令sed和awk

sed

主要功能

sed,stream editor。是一个”非交互式“字符流编辑器。输入流通过程序并输出到标准输出端。
sed主要用来自动编辑一个或者多个文件(替换,插入,删除,追加,更改)

常见应用

  1. 抽区域
  2. 匹配正则表达式
  3. 比较域
  4. 增加,附加,替换

执行过程

sed一次处理一行或多行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行或多行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向或写入命令存储输出。

调用方式

  • 命令行输入

sed [选项] ‘sed命令’ 输入文件

  • 使用sed脚本
    sed [选项] –f sed脚本文件 输入文件

常用选项

-n:不打印,不写编辑行到标准输出,缺省情况下打印所有行[编辑/未编辑]p命令可以打印编辑行

-c:下一命令是编辑命令,使用多项编辑时加入此选项

-f: 调用sed脚本 sed –f sedScriptFile targetFile

-i:将修改附加到源文件上

使用技巧

重定向sed结果输出
$sed ‘sed-command’ inputfile > outputfile

定位内容的方式

x 行x

x,y 行x到行y

/pattern/ 模式

/pattern/pattern/ 两个模式

/pattern/,x 模式+行【在给定行号上查询模式】

X,y /pattern/ 通过行号和模式查询匹配行

X,y! 不包含指定行号

基本的sed命令

P 打印匹配行 print

= 打印匹配行行号

a\ 定位行号后附加新文本信息 append

i\ 定位行号后插入 insert

d 删除定位行 delete

c\ 用新文本替换定位文本 change

s 使用替换模式替换相应模式

r 从另一个文件中读文本 read

w 写文本到一个文件 write

q 第一个模式匹配完成后退出或立即退出

{} 定位执行命令组

n 从另一个文件中读文本下一行,并附加在下一行

g 将模式2黏贴到/pattern n/

y 传送字符

实例:

  • 显示文本

$sed -n '1,4p' file

显示1-4行

$sed -n '4,/Str/p'

显示第4行到匹配到Str的一行,/str/代表匹配到的一行

  • 插入修改文本

$sed '/str/a\ "inserted line"' file

在满足条件的行后,插入内容

sed '/str/i\ "appended line"' file

在满足条件的行前插入内容

$sed '3 c\ "changed line"' file

满足条件的行,整行替换掉

  • 删除文本

$sed '1,3d' file

删除1-3行

$sed '/str/d' file

删除匹配行

$sed -n '/Begin/,/End/p' file | more

删除两个匹配行之间的数据

  • 替换文本

格式:[address[,address]] s/pattern-find/replacement-pattern/[g,p,w,n]

n 1到512之间的一个数字,表示对本模式中指定模式第n次出现的情况进行替换。

g 对模式空间所有出现的情况进行全局更改【缺省只替换首次出现的模式 】

p 打印模式空间的内容

w file

$sed 's/str/tostr/' file

替换每一行首次出现的str为tostr

$sed 's/str/tostr/g' file

替换所有的行内,出现的所有str为tostr

$sed 's/str/tostr/w output' file

替换后重定向到output

转换字符

sed 'y/cp/wd/' test.txt

c转换成w,p转换成d

  • Shell向sed传值

echo $input | sed 's/bb/'$str'/'

echo $input | sed "s/bb/$str/"

awk

主要功能

awk是一种用于处理文本的工具,主要用于格式化报文,或从一个大文本中抽取数据。

执行过程

awk每次读入一行,执行’ ‘中的内容,按模式匹配来采取动作

格式

awk 'pattern+{action}' file

pattern用于筛选查询匹配行,决定了动作何时触发,可以使用条件语句,正则表达式

action用于对筛选后的内容进行处理

BEGIN可以设置计数和打印头(可选)

END打印输出文本总数和结尾状态标识(可选)

常用参数

-F 指定读取一行数据的分隔符,默认为空格
-f 指定处理程序的脚本文件,这个文件必须符合awk语法

调用方式:

awk –f awk-script-file input-files

常用内置参数

$0,$1,....$n $0代表当前行的内容,$i代表当前行被分割后的第i个字段的内容

ARGC 命令行参数个数

ARGV 命令行参数排列

ENVIRON 支持队列中系统环境变量的使用

FILENAME 实际操作的文件名

FNR 浏览文件记录数,<=NR

FS 设置输入域分隔符,等价于命令行-F选项 ,可在BEGIN中进行设置,然后执行的时候均以设置的符号为分隔符

NF 浏览记录 域的个数,在记录被读取时设置【number of fields】一共有多少个域

NR 已读取记录数【number of rows】

RS 控制记录分隔符,缺省:新行\n,Row Separator记录分隔符,可以根据具体数据需求,设置读取一条记录的区间

OFS 输出域的分隔符,缺省空格,输出结果 print $1,$2默认加的是空格,可以在BEGIN中设置,改为其他分隔符

ORS 输出记录的分隔符,缺省:新行\n,整体记录的

实例

  • 打印

打印所有行

awk '{print $0}' file

打印包含头尾

awk 'BEGIN{print "Name Age"}{print $1,$2}END{print "END_OF_REPORT"}'

  • 使用判断语句

< <= > >= == !=

~匹配正则 !~不匹配正则

|| && ! 或且非

awk '{if($2!~/Rudy/) print $0}' content

awk '{if($1=="001" && $2~/^Ru/) print $0}' content

  • 使用内置的变量

awk 'BEGIN{OFS='\t'}{print NF,NR,$0}END{print FILENAME}' content > output

设置输出的分隔符为’\t’,输出一些内置变量的信息

  • AWK变量中的字符串和数字的转换

字符串->整数

$ awk 'BEGIN{a="100";b="10test10";print (a+b+0);}'

110

只需要将变量通过”+”连接运算。自动强制将字符串转为整型。非数字变成0,发现第一个非数字字符,后面自动忽略。

整数->字符串

awk 'BEGIN{a=100;b=100;c=(a""b);print c}'

100100

只需要将变量与””符号连接起来运算即可。

  • 使用内置的字符串函数

gsub(r,s) 在整个$0中用s代替r

gsub(r,s,t) 在整个t中用s替代r

index(s,t) 返回s中字符串t的第一位置

length(s) 返回s长度

match(s,r) 测试s是否包含匹配r的字符串

split(s,a,fs) 在fs上将s分成序列a.fs为分隔符

sprint(fmt,exp) 返回经fmt格式化后的exp

sub(r,s) 用$0中最左边最长的子串代替s

substr(s,p) 返回字符串s中从p开始的后缀部分

substr(s,p,n) 返回字符串s中从p开始长度为n的后缀部分

替换字符串

awk 'BEGIN{FS='\t'}{gsub(/Rudy/,"RUDY");{print $0}}' content

  • 使用printf进行格式化输出

%c ASCII字符

%d 整数

%e 浮点数,可科学计数法

%f 浮点数,小数形式

%g 由awk决定使用哪种浮点数转换e或f

%o 八进制

%s 字符串

%x 十六进制

格式化输出一个字符串

awk -F'\t' '{printf("%s\t%s\n",$2,$1)}' content

  • 向awk中传递参数

awk '{if($3<=AGE){print $0}}' AGE=20 content

  • 写一个awk脚本

    #!bin/awk -f
    BEGIN{
            FS="['\t']"
            printf("%s\t%s\t%s\n","NUMBER","NAME","AGE")
    }
    {
            printf("%s\t%s\t%s\n",$1,$2,$3)
    }
    END{
            print "END OF FILE"
    }

linux正则表达式和grep

正则表达式

正则表达式描述了一种字符串匹配的模式,常用于:

  • grep:从特定的文件中或从标准输入中查找含有某个字符串的行
  • sed :从输入中读取信息,经过编辑后输出
  • awk: 伪装成实用程序的强大编程语言,主要用于文本处理

常用符号

基本元字符

^ 行首定位符,表示以..开始

$ 行尾定位符,表示以..结束

. 匹配单个字符

* 匹配0个或任意多个字符

[] 匹配[]中出现字符范围内的一个字符

\ 用来转义元字符,如{m,n},启用扩展元字符\? +

扩展元字符

? 匹配0个或者1个

+ 匹配1个或者多个

| 或者

()分组符号

特殊匹配字符

[:alnum:] 字母与数字字符

[:alpha:] 字母

[:ascii:] ASCII字符

[:blank:] 空格或制表符

[:cntrl:] ASCII控制字符

[:digit:] 数字

[:graph:] 非控制、空格字符

[:lower:] 小写字母

[:print:] 可打印字符

[:punct:] 标点符号字符

[:space:] 空白字符,包括垂直制表符

[:upper:] 大写字母

[:xdigit:] 十六进制数字

实例

  • ^ $
    ls -l | grep ^d

匹配以d开头的所有内容

  • ls -l | grep d$

匹配以d结束的所有内容

  • ^$

匹配空行

  • ^.$

只包含一个字符的

  • * ? +

compu*ter 匹配u,重复0次或多次

compu?ter 匹配0个或者1个u

compu+ter 匹配1个或多个u

需要注意的是+和?是扩展字符,需要看具体使用正则表达式的环境
如果使用grep需要使用-E指定为扩展模式才能正常使用+和?

  • \可以屏蔽一些特殊字符,如$ . ‘ “ * [ ] ^ | ( ) \ + ?

\.pass 匹配*.pass

  • []

[1234] 匹配1,2,3,4中的一个

[1-9] 数字1-9中的一个

[A-Za-z] 所有字母

[^0-9] 一个非数字的字符

  • \{\}

A\{2\}B 匹配AAB

A\{4,\}B 匹配A出现至少4次B

A\{2,4\}B 匹配A出现在2至4次之间

grep

功能:grep是文本搜索工具,使用正则表达式搜索文本并打印匹配行

格式:grep [options] PATTERN [Files]

注:

输入字符串作为参数,最好双引号括起 “mystr”

调用变量时,也使用双引号括起 “$MYSTR”

使用正则[匹配模式]是,应使用单引号括起 ‘49[32]’

常用选项:

-c 只输出匹配的行数,而不输出匹配的行

-i 不区分大小写

-n 显示匹配行及行号

-q 安静模式,不输出任何东西,如果找到了返回0

-E 启用扩展表达式,可使用扩展字符,如:+ ? | () {} , 或者直接使用egrep

-v 显示不包含匹配文本的所有行

实例:

  1. 在多个文件中查找
    grep “sort” filea fileb 在filea,fileb中查找

  2. 计算匹配行数
    grep -c "sort" file

  3. 使用正则表达式查找
    grep '48[34]' file

  4. 使用扩展元字符
    grep -E 'aaa|bbb' file

  5. 匹配空行
    grep '^$' file

  6. 特殊匹配字符,grep 允许使用国际字符串模式匹配或匹配模式的类名
    grep ‘5[[:upper:]] [[:upper:]]’ data 5开头,两个大写

正则表达式

简介

描述了一种字符串匹配的模式,常用于:
grep:从特定的文件中或从标准输入中查找含有某个字符串的行
sed :从输入中读取信息,经过编辑后输出
awk: 伪装成实用程序的强大编程语言,主要用于文本处理
编程语言:如python

符号

基本符号

^ 行首定位符,表示以..开始
$ 行尾定位符,表示以..结束
. 匹配单个字符
* 匹配0个或任意多个字符
[] 匹配[]中出现字符范围内的一个字符
\ 用来转义元字符,如{m,n},启用扩展元字符\? +

扩展元字符

grep支持基本元字符,通过egrep或者grep -e可以启用扩展元字符。

? 匹配0个或者1个
+ 匹配1个或者多个
| 或者
()分组符号
{i}表示出现了i次,{i,j}表示出现了i到j次

\n 匹配一个换行符。
\t 匹配一个制表符。
\d 匹配一个数字,等价于[0-9]
\D 匹配一个非数字,等价于[^0-9]
\s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于[ \f\n\r\t\v][^\s]表示任何非空白字符
\S 匹配任何非空白字符。等价于[^ \f\n\r\t\v]。

\w 匹配包括下划线的任何单词字符。等价于“[A-Za-z0-9_]”
\W 匹配任何非单词字符。等价于“[^A-Za-z0-9_]”。[^\w]
注意\S\w包括@#¥等更多特殊字符

简单实例

  • ^ $
    ls -l | grep ^d 匹配以d开头的所有内容
    ls -l | grep d$ 匹配以d结束的所有内容
    ^$ 匹配空行
    ^.$只包含一个字符的
    
  • * ? +
    compu*ter 匹配u,重复0次或多次
    compu?ter 匹配0个或者1个u
    compu+ter 匹配1个或多个u
    
  • \
    可以屏蔽一些特殊字符,如$ . ‘ “ * [ ] ^ | ( ) \ + ?
  • []

    [1234] 匹配1,2,3,4中的一个
    [1-9] 数字1-9中的一个
    [A-Za-z] 所有字母
    [^0-9] 一个非数字的字符
    
  • {}

    A{2}B   匹配AAB
    A{4,}B   匹配A出现至少4次B
    A{2,4}B  匹配A出现在24次之间
    

匹配实例

匹配html标签

<(\w*)>.*?<\1>

.*贪婪匹配,尽可能匹配多
.*?最小匹配,尽可能匹配少

匹配url

(http|https|ftp)://[\S]*

匹配邮箱

\w+(-+.\w+)*@\w+(-+.\w+)*

注意邮箱中可能存在的.-+

匹配空行,可能有\t空格等空字符

^\s*$

匹配国内电话

\d{3,4}-\d{8}

匹配身份证号

(\d{15}|\d{17}(\d|x))

匹配ip地址

\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}

应用

在vi中修改参数,foo(a,b,c)的实例改为foo(b,a,c)

:s/foo(\([^,]*\),\([^,]*\),\([^,]*\))/foo(\2,\1,\3)/gc

sed中的应用

删除所有空行

sed '/^$/d' test

在awk中应用

打印正则匹配到的部分

cat test | awk '$2~/ee/{print}'



  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值