Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1104945
  • 博文数量: 170
  • 博客积分: 1603
  • 博客等级: 上尉
  • 技术积分: 1897
  • 用 户 组: 普通用户
  • 注册时间: 2010-07-09 15:54
文章分类

全部博文(170)

文章存档

2016年(27)

2015年(21)

2014年(27)

2013年(21)

2012年(7)

2011年(67)

我的朋友

分类: Python/Ruby

2011-04-26 15:03:09

for i in `find /usr/lib/ -type l ! -exec test -r {} \; -print`; do rm -rf $i; done
头20个字节替换
cat RunTeskSql.slg | grep -v proc_updatebuildres | sed 's/^.\{20\}//g' | sed 's/$/\;/g'
末尾3个字节替换
sed 's/.\{3\}$/exe/g'
每段都加上括号
sed 's/.*/(&)/g'

sed -i  可以直接编辑替换文本内容

小技巧示例
sed 's#10#100#g' example-----不论什么字符,紧跟着s命令的都被认为是新的分隔符,所以,“#”在这里是分隔符,代替了默认的“/”分隔符。

统计不重复的行用sort会改变顺序,用下面awk
awk '!a[$0]++' test.txt

不担心顺序可以用sort后uniq来删除重复行

上面的是只保存一个空行
sed '/^$/d' test.txt | awk '!a[$0]++'

1:#!/bin/bash 
2:#rename file extesions 
3:# 
4:#     rfe old_extensions new_extension
5::#
去除上面文本中数字开头带2个冒号的
sed s'/^[0-9]:\{2\}#//g' 1.txt


\<锚定单词的开始,如:/\
\>锚定单词的结束,如/love\>/匹配包含以love结尾的单词的行。
x\{m\}重复字符x,m次,如:/0\{5\}/匹配包含5个o的行。
x\{m,\}重复字符x,至少m次,如:/o\{5,\}/匹配至少有5个o的行。
x\{m,n\}重复字符x,至少m次,不多于n次,如:/o\{5,10\}/匹配5--10个o的行。



下面文本中-----之间内容超过2行的的提取出来
-------------------------------------------------------
2011-06-26 20:00:00 a.com 铜川市 1111 24.09 36.12
-------------------------------------------------------
2011-06-26 18:00:00 a.com 鞍山市 1111 23.95 36.51
2011-06-26 19:00:00 b.com 鞍山市 2222 26.52 21.65
-------------------------------------------------------
2011-06-26 18:00:00 a.com 鞍山市 1111 26.97 28.24
2011-06-26 19:00:00 b.com 鞍山市 2222 27.12 20.32
2011-06-26 19:00:00 c.com 鞍山市 3333 27.12 20.32
-------------------------------------------------------

想搜索出的结果如下
-------------------------------------------------------
2011-06-26 18:00:00 a.com 鞍山市 1111 23.95 36.51
2011-06-26 19:00:00 b.com 鞍山市 2222 26.52 21.65
-------------------------------------------------------
2011-06-26 18:00:00 a.com 鞍山市 1111 26.97 28.24
2011-06-26 19:00:00 b.com 鞍山市 2222 27.12 20.32
2011-06-26 19:00:00 c.com 鞍山市 3333 27.12 20.32
-------------------------------------------------------

awk --re-interval 'BEGIN{FS="\n";RS="-{2,}"};NR==1{ printf RT}NF>3{printf $0RT}' a.txt

--re-interval 使用这个选项就允许使用大括号形式的正则表达式了。
FS 输入字段分隔符(缺省为:space:),相当于-F选项
RS:输入记录分隔符,缺省为"\n",缺省情况下,awk把一行看作一个记录;如果设置了RS,那么awk按照RS来分割记录。
注意 \n为字段分隔符的话---本身这些行也算在里面了

这个可以用来分析日志

一个更加好看的写法
awk --re-interval -v RS='-{2,}' -v FS='\n' 'NR==1{printf RT}NF>3{printf $0RT}' a.txt
-v类似sed的-e,当指定一行多个个条件的时候需要-v支持

RT是输出记录分隔符,NR是记录数,即记录分割符之间的记录数(\n分割的话就是行数罗),$0RT是$0 和RT不是$ORT

变量参考

http://blog.chinaunix.net/uid-23504396-id-3482067.html



sed版本的
sed -nr '1p;H;/--+/{x;/\n?([^\n]+\n){3,}/{s/\n//;s/--+//p};g;h}'


类似连表查询的连文件拼接



删除偶数行
sed "n;d" 1.txt

试着解释一下吧:

n (注意是小写n不是大写N)
If auto-print is not disabled, print the pattern space, then, regardless, replace the pattern space with the next line of input. If there is no more input then sed exits without processing any more commands.

Delete the pattern space; immediately start next cycle.

n命令读取偶数行时并存入到pattern space,d命令就清空pattern space的内容。所以命令输出奇数行。文章开头的文本的读取过程如下:
读取第一行输出;n命令读取第二行,d命令清空pattern space;由于第二行已经读取,所以继续读取第三行,输出;n命令读取第四行,d命令删除pattern space的内容;读取第五行,输出。输出的内容:


awk版
删除偶数行:
cat file |awk "NR%2==1"

删除奇数行:
cat file |awk "NR%2==0"


awk中如何输出单引号 如何在awk中打印输出单引号呢 shell如何处理单引号呢 ?
也就是shell中对单引号的处理问题(这个在输出sql语句中非常有作用)

解决办法一
awk '{print " '\'' "}'
把转义的单引号',用两个单引号括起来,使其不执行

解决办法二
awk '{print "\047"$1"\047"}'
\b  退格,\f  换页,\n  换行,\r  回车,\t  跳格,\047 八进制值 47,

解决办法三
awk -v v=\' '{print v$1v}'
awk -v var="'" '{print var$1var}'

就是用变量


1.txt内容

@{#{2012-12-12}#{500}#{Exception: parameter is null
   com.test.A(12);
         com.test.B(14)
}#}@
lolia!!!
lll
@{#{2012-12-12}#{500}#{Exception: parameter is null
ccc 
}#}@

提取@{ 和 }@之间的所有内容

cat 1.txt | sed ':st;N;s/\n/\t/g;tst' | grep -oP '(?<=@{).+?(?=}@)' 


首先合并所有行,把所有\n替换成\t

然后grep 打印出所有@{ ... }@之间的字符

-o表示只打印之间的,不指定打话lolita lll都会打印出来

P表示grep使用perl的正则,从看到的!非常好用强烈推举!


shell字符串直接处理
http://www.cnblogs.com/chengmo/archive/2010/10/02/1841355.html

表达式 含义
${var} 变量var的值, 与$var相同
   
${var-DEFAULT} 如果var没有被声明, 那么就以$DEFAULT作为其值 *
${var:-DEFAULT} 如果var没有被声明, 或者其值为空, 那么就以$DEFAULT作为其值 *
   
${var=DEFAULT} 如果var没有被声明, 那么就以$DEFAULT作为其值 *
${var:=DEFAULT} 如果var没有被声明, 或者其值为空, 那么就以$DEFAULT作为其值 *
   
${var+OTHER} 如果var声明了, 那么其值就是$OTHER, 否则就为null字符串
${var:+OTHER} 如果var被设置了, 那么其值就是$OTHER, 否则就为null字符串
   
${var?ERR_MSG} 如果var没被声明, 那么就打印$ERR_MSG *
${var:?ERR_MSG} 如果var没被设置, 那么就打印$ERR_MSG *
   
${!varprefix*} 匹配之前所有以varprefix开头进行声明的变量
${!varprefix@} 匹配之前所有以varprefix开头进行声明的变量

echo ${filedir}
/root/rpmbuild/BUILDROOT/erlang-R15B03-3.x86_64/lolita-glalga
echo $buildroot
/root/rpmbuild/BUILDROOT/erlang-R15B03-3.x86_64
echo ${filedir/"${buildroot}"/}  #这里不用引号也可,但是在rpmbuild的spec中一定要用引号,比如 ln -sf ${m/"%buildroot"/} %_mandir/man3/$(basename $m .gz)erl.gz
/lolita-glalga

阅读(1276) | 评论(0) | 转发(0) |
0

上一篇:vim键盘图

下一篇:禁用ip6

给主人留下些什么吧!~~