正则定义
规定一些特殊语法表示字符类,数量限定符,位置关系,然后用这些特殊语法和普通字符一起表示亿额模式,这就是正则表达式
正则三要素
字符类
数量限定符
位置限定符
正则中使用单引号保证内部字符不被shell解释掉
字符类
. 匹配任意一个字符
[] 匹配括号中的任意一个字符
- 在[]中表示字符范围
^ 位于[]内的开头,表示匹配除了括号中字符外的任意一个字符
[[:xxx:]] grep工具预定义的一些命名字符类 eg alpha字 digit 数字
数量限定符
?前边字符0-1次
+前边字符1-多次
*前边字符0-多次
{n}前边单元N次.匹配满足就返回,也可能后边重复多余N次
{n,}至少n次
{m,n}m到n次,也可能多余n次..可以增加$结尾限制
位置限定符
^匹配行首位置
$行尾位置
\<匹配单词开头位置
\>匹配单词结尾位置
\b匹配单词开始或者结尾位置
\B匹配非单词开头和结尾的位置
其他特殊字符
\ 转义
()将整个正则表达式组成一个单元,使用数量限定符
| 连接两个子表达式,表示或的关系
注:以上为grep正则表达式的extended规范,base也有,但是字符?+{}\()解释为普通字符,要表示上述含义需要加\转义.-E同理
sed
基本概念:sed是一种流式编辑器(stream idter)
基本格式
sed option -f scriptfile file1 file2
sed option 'script' file1 file2
sed的编辑命令可以直接当命令行参数传入,也可以写成一个脚本文 件然后用-f参数指定,编辑命令的格式为
/pattern/action
sed是一种在线编辑器,每次处理一行内容.每次处理将当前行放入缓存"模式空间",模式空间处理完成后移动到屏幕
格式
1. /pattern/p :打印匹配pattern的行 P(print) sed -n '111' log 相当于grep,默认会打印一遍原文以及匹配项
2. /pattern/d :删除匹配pattern的行 D(delete)
3. /pattern/s/pattern1/pattern2/:查找符合pattern的行,将该行第一个匹配pattern1的字符串替换为pattern2
4. /pattern/s/pattern1/pattern2/g:查找符合pattern的行,将该行所有匹配pattern1的字符串替换为pattern2
eg: sed '/^t/s/Z/--&--/g' log
将log文件中所有的t字符开始的(正则狮)行中的Z替换为--Z--,,,&符号表示匹配pattern1的字符串
sed '/^[0-9]/s/\([0-9]*\)/~\1~' log
将0-9开始的,0-9*替换为~0-9~ .因为sed默认使用basic正则,所以()需要转义, -r使用extended
pattern2中的\1表示与pattern1的第一个括号匹配的内容.\2表示与pattern1中第二个括号匹配的内容5.sed -i 做的修改会先修该原文
6.定址:用于据定对哪些行进行编辑.地址形式可以是数字,正则或者二者结合.如果没有定制,那么sed处理所有的行
eg
sed -n '3p' file 打印第三行
sed -n '100,300p' fiile 打印[100,300]行
sed '/start/, /end/d' file 删除start 和end行之间的行7.命令和选项
sed命令告诉sed如何处理由地址指定的各输入行,如果没有指定则处理所有的输入行命令:
a\在当前行后添加一行或者多行,多行,每行需要用"\"续行
c\用次符号厚的新闻本替换当前行的文本 .....\
i\在当前行中插入文本,......
h吧模式空间李的内容赋值到暂存缓冲区
H吧模式空间的内容追加到暂存...
g复制,覆盖缘由内容
G追加
I列出非打印字符
p打印行
q结束或退出sed
r从文件读取输入行
!对所选行意外的所有行应用名林
s替换
g行内进行全局替换
w将所选行写入文件
x交换暂存缓冲区与模式空间的内容
y将字符替换为另一个字符
选项
-e进行多项编辑
-n取消默认的输出
-f指定sed脚本的文件名
正则表达式
^行首定位
$行尾定位
. 除换行以外的单个字符
*匹配0-多个前导字符
[]任意一个
[^ ]取反
\(..\) 定义元祖标签,之后可以使用\1 \2 ... \9引用
&保存查找串以便替换中引用.
\< \>词头词尾
x\{m\} 连续m个x
...
...
awk
sed以行为单位处理文件,awk更强,还能以列伪单位处理文件.
行分割缺省换行
列分割缺省连续空格和tab.
分割符也可以自己定义
命令基本形式
awk option 'script' file1 file2
swk option -f scriptfile file1 file2
/pattern/{actions}
如果每日有pattern部分,那么所有行都执行actions部分.
自动变量$1 $2 ... 分别表示第1列................... $0 表示整个当前行
awk有类似的print语句,还有两个特殊变量condition-BEGIN和END
BEGIN后边的句子在整个文件之前执行一次,END之后的句子在整个文件之后执行一次
搜索 -F
awk -F: '/root/' /etc/passwd
调用方式
1命令行方式
awk[-F field-separator] 'commands' input-file(s)
commands是awk命令,[-F 域分割符]是可选的. input-file是待处理文件
2shell脚本方式
#!/bin/awk -f
BEGIN{
count1=0;
count2=0;
}
{
if($1<100)
count1++;
}
else{
count2++;
}
END{
printf("%d",count2);
}
3将所有的awk命令插入一个单独文件,然后调用:
awk -f awk-script-file input-file(s)
awk调用正则表达式
A.awk语句:
awk '/REG/{action}'
B.awk正则运算语句(~,~! 等同! ~)
C.awk内置使用正则表达式函数
gsub(Ere,Reql,[In])
sub(Ere,Reql,[In])
match(string,Ere)
split(sting,A,[Ere])
awk内置变量&&杂项
ARGC
ENVIRON
FILENAME
FNR 浏览文件的记录数
FS 等价-F
NF浏览记录的域的个数
NR已读的记录数
OFS输出域分隔符
ORS输出记录分隔符
RS控制记录分隔符
$0 整条记录
$1...$.. 第n个域
print
printf 和c语言printf类似
awk进阶
1循环(类C)
2条件(类C)
3数组 下标键值
CUT
在文件中负责剪贴数据,以每一行为一个处理对象
剪贴依据(三个定位方式)
字节(bytes) -b
cut -b 1-3 file #按照字节剪贴1-3个字符
字符(characters) -c
域(fields) -f
-d指定域分割符,-f指定检出哪几个域
cut -d: -f 1-2,5 /etc/passwd
sort
按照字符ascii排序
-u去除重复行
-r将默认升序修改为降序
-o将结果重定向写入文件,可以指定到源文件
-n以数字方式排序而非码拍.
-t 设定分隔符, -k指定分割之后的列.实现第k列排序
-f忽略大小写比较
-c检查是否已排序,如果乱序,输出第一个乱序的行的相关信息.返回1
-C检查,如果未排序,返回1
-M以 月份方式排序
-b忽略空白
uniq
去除重复
-c显示输出中,在每行行首加上本行出现次数,取代-u,-d
-d只显示重复行
-u只显示不重复
tcpdump
strace
archlinux
gento
网友评论