博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

sed, grep,sort

Posted on 2015-06-19 09:40  bw_0927  阅读(241)  评论(0)    收藏  举报

log_size=`du -s log | tr -cd "[.0-9]"`   #截图数字

 

 

; 多重替换 (实际就是多语句,只不过用;加在一行里)
sed 's/scarlet/red/g;s/ruby/red/g;s/puce/red/g'
不管是“scarlet”“ruby”还是“puce”,一律换成“red”

 

sed  -i 's/properties/property/g'  build.xml   直接修改源文件

 

grep -rl 'aaa.h' . | xargs sed -i 's/aaa.h/bbb.h/g'         目录sed

grep -RiEn

-E: 高级正则

-c: 只打印匹配的行数

-l:  匹配的行前加上行号

 

在Linux中grep和egrep分别使用了基本的的正则表达式和扩展的正则表达式,区别是egrep的使用的扩展正则表多了一个+ (匹配其前面的字符至少1次) 和 | (或)以及不用加\转义

[^]: 匹配指定范围外的任意单个字符

 * : 匹配星号前面的字符任意次,*符号前面接字符,表示匹配前面那个字符零次或多次,只能匹配前面紧挨着的单个字符或分组字符

 

\? : 匹配问号前面的字符0次或1次

 

+: 匹配其前面的字符至少1次(此为egrep或 grep -E 专有)

 

 \{m\}: 匹配前面的字符m次

 

\{m,n\}: 匹配前面的字符m至n次

 

\{m,\}: 匹配前面的字符至少m次,m次以上

 

\{0,n\}: 匹配前面的字符至多n次,0不能省略

 

说明:以上元字符当egrep使用时通通不用加反斜线(\)。

(3)、字符位置锚字匹配:

    ^: 用于锚定字符串的行首,匹配的字符必须是一行的第一个

    $: 用于锚定字符串的行尾,匹配的字符必须是一行的最后一个

   \<: 用于锚定词首, 用法和\b加上字符是一样的,放在字符前面

   \>: 用于锚定词尾, 用法和\b加上字符是一样的,放在字符后面

 

(4)、分组匹配:

  \(\):括号内的字符为一组,作为一个整体来匹配

    |:  或者(此为egrep或 grep -E 专有)

说明:当使用egrep时,小括号不用加反斜线(\)。

 

(5)、后向引用:

\1: 这个必须和分组结合使用才能发挥作用,代表着匹配前面从左往右数第一个括号内匹配到的结果再来一遍,

注意是结果再来遍,表示前后要一模一样,数字代表着前面括号的编号,类似的可以有\2、\3...。
-----------------------------------

https://blog.51cto.com/wubinary/1362549

 

 

 

sed使用shell变量

sed -i 's/pattern1/pattern2/g' inputfile
2  #如果要使用shell变量,就需要使用双引号
3 pattern1=XXX
4 pattern2=XXX 
5 sed -i "s/$pattern1/$pattern2/g" inputfile

 

shell里面的单引号不会做变量替换或者转义。 

sed -n '104195,${/18616896927/p}' log/stream_serv-15-06-26-10-24-20.log > 1.succ

-n 不打印原记录

10419,$   从10419行到最后一行开始匹配

-r, --regexp-extended 

 

ps -ef | sed -n '1p;/stream_serv/p' | grep -v sed

 

http://www.cnblogs.com/ggjucheng/archive/2013/01/13/2856901.html

 

sed 是一种在线编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。

接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有 改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。

http://weizhifeng.net/learning-sed.html

 

地址约束(address restriction)

就是对输入的行进行一个条件测试,如果满足就执行接下来的sed命令,否则不执行,主要有以下类型: 
* 5,8表示输入的行位于第5到第8行之间 
* /match/表示输入的行中匹配到了match 
* /start/,/stop/表示从匹配到start开始,到匹配到stop为止,输入行位于这个区间 
* 5,/stop/表示从第5行开始,到匹配到stop为止,输入行位于这个区间

 

 

语法格式

单条命令

sed 'address command' < in > out

多命令

sed -e 'address command'  -e 'address2 command2' < in > out 

如果命令太多,可以把命令放在一个文件script-file中

sed -f script-file < in > out 

常用命令

1. s(substitute)这个命令是我们用的最多的,用来进行文本替换

把old.txt中的"foo"全部(g的作用)替换成"bar"

sed 's/foo/bar/g' old.txt > new.txt

只替换第二个"foo"为"bar"

sed 's/foo/bar/2' old.txt > new.txt

&代表匹配的字符内容,以下会把“foo”替换成“(foo)”

echo foo | sed 's/[a-z]+/(&)/'

可以用1,2...9来引用正则表达式的子模式,以下的输出是“bar foo”

echo foo bar | sed 's/([a-z]*) ([a-z]*)/2 1/'
-r 时,取分组要\1, \2这样

默认情况下sed会把替换之后的内容完全输出,以下命令可以让sed只输出被修改过的内容

sed -n 's/foo/(&)/p' new.txt

这只会对第5行至第8行进行处理,其中“5,8”为一个区间,与“s/foo/(foo)/”之间有一个空格

sed '5,8 s/foo/(foo)/'

以下会对101行以后(包括101)的内容做替换,“$”代表最后一行

sed '101,$ s/foo/bar/'

以下会对文本中含有"start"行的内容进行替换

sed '/start/ s/foo/bar/'

如果一个表达式以反斜杠开始,那么接下来的字符就是分隔符。以下使用","来作为分隔符

sed ',^#, s/[0-9][0-9]*//'

你可以指定两个正则表达式作为一个区间。以下会删除“start” “stop”两个关键词之间的注释

sed '/start/,/stop/ s/#.*//'

你可以把行号和正则表达式合并在一起。以下将会从文件第一行开始到匹配到“start”为止,把这个范围内的注释删掉

sed -e '1,/start/ s/#.*//'

2. d(delete)这个命令用来删除必要的行

以下把11行之后的内容删掉

sed '11,$ d'

以下为删除所有空白和tab

sed -e 's/#.*//' -e 's/[ ^I]*$//' -e '/^$/ d'

3. p(print) 这个命令用来控制sed的输出

打印前10行

sed -n '1,10 p'

打印匹配的内容,和'grep match'一样的效果

sed -n '/match/ p'

不打印匹配的内容,和'grep -v match'一样的效果

sed -n '/match/ !p'

4. q(quit)命令用来在适当的时候让sed退出

在第11行退出

sed '11 q'

q命令不能用在区间中,以下是错的,因为你不可能让sed退出10次

sed '1,10 q'

5. w(write)这个命令用来把处理过的内容写入指定的文件

把"in"中的偶数写入文件"even"

sed -n 's/^[0-9]*[02468]/&/w even' < in

6. r(read)这个命令用来读入指定文件的内容

以下在包含INCLUDE的行后面插入"file"文件的内容

sed '/INCLUDE/ r file' < in

7. a(add), c(chang),i(insert)

  • a 在匹配行后面添加一行
  • c 替换匹配内容的行
  • i 在匹配行前面添加一行

在WORD后面插入一行

sed '
    /WORD/ a
    Add this line after every line with WORD
'

在WORD前面插入一行

sed '
    /WORD/ i
    Add this line before evey line before WORD
'

替换WORD所在行的内容

sed '
    /WORD/ c
    Replace the current line with the line
'

以上三个命令都可以插入多行

sed '
    /WORD/ a
    Add this line
    This line
    And this line
'

8. = 命令用来输出行号

输出行号 sed -n '/foo/ =' test.txt

输出最大行号

sed -n '$=' test.txt

9. y这个命令用来做转换用

把单词从小写装换成大写

sed 'y/abcdef/ABCDEF/' file

分组

你可以用「{」和「}」来把命令分组,如下

#!/bin/sh
# This is a Bourne shell script that removes #-type comments
# between 'begin' and 'end' words.
sed -n '
    /begin/,/end/ {
    s/#.*//
    s/[ ^I]*$//
    /^$/ d
    p
    }
'

参考:

http://www.grymoire.com/Unix/Sed.html


 

一、交集

sort a.txt b.txt | uniq -d

二、并集

sort a.txt b.txt | uniq 

三、差集

a.txt-b.txt:

sort a.txt b.txt b.txt | uniq -u

b.txt - a.txt:

sort b.txt a.txt a.txt | uniq -u

四、相关的解释

使用sort可以将文件进行排序,例如 :

-n 按照数字格式排序

-i 忽略大小写,

-r 为逆序输出等

uniq为删除文件中重复的行,得到文件中唯一的行,后面的命令 -d 表示的是输出出现次数大于1的内容 ,-u表示的是输出出现次数为1的内容,那么对于上述的求交集并集差集的命令做如下的解释:

sort a.txt b.txt | uniq -d:将a.txt b.txt文件进行排序,uniq使得两个文件中的内容为唯一的,使用-d输出两个文件中次数大于1的内容,即是得到交集

sort a.txt b.txt | uniq :将a.txt b.txt文件进行排序,uniq使得两个文件中的内容为唯一的,即可得到两个文件的并集

sort a.txt b.txt b.txt | uniq -u:将两个文件排序,最后输出a.txt b.txt b.txt文件中只出现过一次的内容,因为有两个b.txt, 所以会输出只在a.txt出现过一次的内容,即是a.txt-b.txt差集

对于b.txt-a.txt为同理