shell正则表达式

正则定义

规定一些特殊语法表示字符类,数量限定符,位置关系,然后用这些特殊语法和普通字符一起表示亿额模式,这就是正则表达式

正则三要素

字符类
数量限定符
位置限定符

正则中使用单引号保证内部字符不被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

点赞