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为同理