linux正则表达式

基础正则表达式

LANG=C A-Z a-z连续
LANG=zh_CN a A b B...
如果在语系LANG=zh_CN中[A-Z]会将b c选出来

特殊符合 代表意义
[:alnum:] 代表英文大小写字符与数字
[:alpha:] 代表英文大小写字符
[:blank:] 代表空格键和tab键
[:cntrl:] 代表键盘上面的控制按键,即包括CR,LF,Tab, Del等
[:digit:] 代表数字
[:graph:] 除了空格和tab外的其他所有按键
[:lower:] 小写字符
[:print:] 任何可以被打印出来的字符
[:punct:] 代表标点字符,“ ‘ ? !;:# $
[:upper:] 大写字符
[:space:] 任何会产生空白的字符,空格键 tab CR等
[:xdigit:] 代表十六进制的数字类型,0-9,A-F, a-F
// 显示行号,并显示查找到的行前面2行,后面3行
# grep -n -A3 -B2 --color=auto '搜寻字符串’ filename
// 不要空白行 -v是反向选择
# grep -v '^$' filename
// 非g开头的xoo
# grep -n '[^g]oo' filename
// 以小写字母开头
# grep -n '^[a-z]' filename
// 小数点代表一个任意字符
# grep -n 'g..d' filename
// 重复0个或者多个前面的RE(Regular Expression)字符,可以是控制符或者一个o以上的字符
# grep -n 'o*' filename
// g......g
# grep -n 'g.*g' filename
// 限定连续RE字符范围{},在g与g之间有2个到3个存在的o
# grep -n 'go\{2,3\}g' filename
# ls -al | wc -l
wc - print newline, word, byte counts for each file

sed

# sed [-nefri] [动作】
参数:
-n : 安静模式,经过sed特殊处理的那一行才会被列出来
-e : 直接在命令行模式进行sed的动作编辑
-f : 直接将sed的动作写在一个文件内,-f filename则可以执行filename内的sed动作
# scriptfile 一行用;分隔
sed [options] -f scriptfile files
-r : sed的动作支持的是扩展型正则表达式的语法
-i : 直接修改读取的文件内容,而不是由屏幕输出
动作说明: [n1,[n2]] function

a\ 在当前行下面插入文本。 
i\ 在当前行上面插入文本。 
c\ 把选定的行改为新的文本。 
d 删除,删除选择的行。
 D 删除模板块的第一行。
 s 替换指定字符
 h 拷贝模板块的内容到内存中的缓冲区。
 H 追加模板块的内容到内存中的缓冲区。
 g 获得内存缓冲区的内容,并替代当前模板块中的文本。 
G 获得内存缓冲区的内容,并追加到当前模板块文本的后面。
 l 列表不能打印字符的清单。
 n 读取下一个输入行,用下一个命令处理新的行而不是用第一个命令。 
N 追加下一个输入行到模板块后面并在二者间嵌入一个新行,改变当前行号码。
 p 打印模板块的行。 P(大写) 打印模板块的第一行。
 q 退出Sed。
 b lable 分支到脚本中带有标记的地方,如果分支不存在则分支到脚本的末尾。 
r file 从file中读行。
 t label if分支,从最后一行开始,条件一旦满足或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾。 
T label 错误分支,从最后一行开始,一旦发生错误或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾。
 w file 写并追加模板块到file末尾。
 W file 写并追加模板块的第一行到file末尾。
 ! 表示后面的命令对所有没有被选定的行发生作用。
 = 打印当前行号码。
 # 把注释扩展到下一个换行符以前。

g 表示行内全面替换。 
p 表示打印行。
 w 表示把行写入一个文件。
 x 表示互换模板块中的文本和缓冲区中的文本。 
y 表示把一个字符翻译为另外的字符(但是不用于正则表达式)
 \1 子串匹配标记 
& 已匹配字符串标记

^ 匹配行开始,如:/^sed/匹配所有以sed开头的行。 
$ 匹配行结束,如:/sed$/匹配所有以sed结尾的行。
 . 匹配一个非换行符的任意字符,如:/s.d/匹配s后接一个任意字符,最后是d。
 * 匹配0个或多个字符,如:/*sed/匹配所有模板是一个或多个空格后紧跟sed的行。
 [] 匹配一个指定范围内的字符,如/[sS]ed/匹配sed和Sed。
 [^] 匹配一个不在指定范围内的字符,如:/[^A-RT-Z]ed/匹配不包含A-R和T-Z的一个字母开头,紧跟ed的行。
 \(..\) 匹配子串,保存匹配的字符,如s/\(love\)able/\1rs,loveable被替换成lovers。 
& 保存搜索字符用来替换其他字符,如s/love/**&**/,love这成**love**。 
\< 匹配单词的开始,如:/\ 匹配单词的结束,如/love\
>/匹配包含以love结尾的单词的行。
 x\{m\} 重复字符x,m次,如:/0\{5\}/匹配包含5个0的行。
 x\{m,\} 重复字符x,至少m次,如:/0\{5,\}/匹配至少有5个0的行。 
x\{m,n\} 重复字符x,至少m次,不多于n次,如:/0\{5,10\}/匹配5~10个0的行。

s : 替换,可以搭配正则表达式 s/old/new/Ng  从第N处匹配处开始替换
默认定界符是/。也可以用其他任意
#删除最后一行
sed '$d' file
# 删除文件中所有开头为test的行
sed '/^test/'d file

# nl /etc/passwd | sed '2,5d'
nl : 将文件内容打印到stdout
// 在第二行后面新增2行
# nl /etc/passd | sed '2a Drinking tea ....'
> drink bear ?'
# cat /etc/man.config | grep 'MAN' | sed 's/#.*$//g' | sed '/^$/d'
// sed后面如果要接超过2个以上的动作,每个动作前面要加-e
# sed -e '4d' -e '6c no six line' filename
// 查看文件内容中特殊字符
# sed -n l filename
# ??-i.bak是啥东西
# sed -i.bak "s/gt 600/gt 900/g" filename
// 所有在test和check所确定的范围内的行都将被打印
sed -n '/test/,/check/p' file
// 打印从第5行开始到第一个包括test开始的行之间的所有行
sed -n '5,/^test/p' file
// 对于模板test和west之间的行,每行的末尾用字符串aaa bbb替换
sed '/test/,/west/s/$/aaa bbb/' file
// 从文件读入: r命令
// file里的内容被读进来,显示在与test匹配的行后面,如果匹配多行,则file的内容将显示在所有匹配行的下面
sed '/test/r file' filename
// 写入文件 w
sed -n '/test/w file' example
// 追加(行下)a\
sed '/^test/a\this is a test line' file
// 在第2行之后(行下)插入
sed -i '2a\this is a test line' file
// 插入(行上):i\
sed '/^test/i\this is a test line' file
sed -i '5i\this is a test line' test.conf
// 下一个:n命令
// 如果test被匹配,则移动到匹配行的下一行,替换这一行的aa,变为bb,并打印该行,然后继续
sed '/test/{ n; s/aa/bb/;}' file
// 变形:y命令
// 把1~10行内所有abcde转变为大写,注意,正则表达式元字符不能使用这个命令:
sed '1,10y/abcde/ABCDE/' file
// 打印完第10行后,退出
sed ‘10q' file
sed -n 'p;n' test.txt #奇数行 
sed -n 'n;p' test.txt #偶数行 
sed -n '1~2p' test.txt #奇数行 
sed -n '2~2p' test.txt #偶数行 
打印匹配字符串的下一行 
grep -A 1 SCC URFILE 
sed -n '/SCC/{n;p}' URFILE 
awk '/SCC/{getline; print}' URFILE

//保持和获取h和G
在sed处理文件的时候,每一行都被保存在一个叫模式空间的临时缓冲区中,除非行被删除或者输出被取消,否则所有被处理的行都将 打印在屏幕上。接着模式空间被清空,并存入新的一行等待处理。
sed -e '/test/h' -e '$G' file
互换模式空间和保持缓冲区的内容。也就是把包含test与check的行互换:
sed -e '/test/h' -e '/check/x' file

sed不支持\d这种选项
sed后'{print }'。里面()"需要转义
sed表达式可以使用单引号来引用,但是如果表达式内部包含变量字符串,就需要使用双引号
也可以使用new_db_name=${new_db_name/$replace_string/$replace_with}

如果替换字符串中含有\,替换的时候回出现sed: -e expression #1, char 6: unterminated `s' command](http://blog.csdn.net/wengyupeng/article/details/51840394)
web=$(curl | sed 's/\//g')

扩展正则表达式

egrep === grep -E

RE字符 意义和范例
+ 重复一个或一个以上的前一个RE字符
egrep -n 'go+d' filename
god good goo...d
0个或者1个的前一个RE字符
egrep -n 'go?d' filename
gd god

egrep -nr 'gd
goood' filename
() 找出组字符串
egrep -n 'g(lad
oo)d filename
glad good
()+ 多重组的判别
egrep 'A(xyz)+C' filename
AxyzC AxyzxyzC Axyzxyz....C

那个!在正则表达式当中不是特殊字符

printf '打印格式‘ 实际内容
参数:
\a : 警告声音输出
\b : 退格键
\f :清除屏幕
\n : 输出新的一行
\r : enter
\t : 水平tab
\v : 垂直tab
\xNN : NN为两位数的数字,可以转换数字成字符
%ns : n个字符串
%ni : 
%N.nf

awk

# awk '条件类型1{动作1} 条件类型2{动作2} ....' filename
$0  整行
$1 第一列
...
# last -n 5 | awk '{print $1 "\t lines:" NR "\t columes: " NF}'
# cat /etc/passwd | awk '{FS=":"} $3<10 {print $1 "\t " $3}'
# cat /etc/passwd | awk '{if(NR==1) printf "%10s",$0} NR>=2{}'

搜索/etc/passwd有root关键字的所有行

#awk -F: '/root/' /etc/passwdroot:x:0:0:root:/root:/bin/bash

这种是pattern的使用示例,匹配了pattern(这里是root)的行才会执行action(没有指定action,默认输出每行的内容)。
搜索支持正则,例如找root开头的: awk -F: '/^root/' /etc/passwd
搜索/etc/passwd有root关键字的所有行,并显示对应的shell
# awk -F: '/root/{print $7}' /etc/passwd /bin/bash

变量名称 代表意义
NF 每一行拥有的字段总数
NR 目前awk所处理的第几行数据
FS 目前的分隔符,默认是空格键

所有awk的动作,即在{}内的动作,如果有需要多个命令辅助时,可以利用分号或者enter来隔开每个命令
awk中变量不需要加$

head tail last

# head -n 3 filename
# tail -n 2 filename
# last 

diff

# diff [-bBi] from-file to-file
from-file和to-file可能是-
-b : 忽略一行当中仅有多个空白的区别
-B :忽略空白行
-i : 忽略大小写

cmp

# cmp [-s] file1 file2
-s :列出所有不同的点

patch

# patch -pN < patch_file
# patch -R -pN < patch_file

cut

其语法格式为:
cut  [-bn] [file] 或 cut [-c] [file]  或  cut [-df] [file]

使用说明
cut 命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段写至标准输出。如果不指定 File 参数,cut 命令将读取标准输入。必须指定 -b、-c 或 -f 标志之一。

主要参数
-b :以字节为单位进行分割。这些字节位置将忽略多字节字符边界,除非也指定了 -n 标志。
-c :以字符为单位进行分割。
-d :自定义分隔符,默认为制表符。
-f :与-d一起使用,指定显示哪个区域。
-n :取消分割多字节字符。仅和 -b 标志一起使用。如果字符的最后一个字节落在由 -b 标志的 List 参数指示的<br />范围之内,该字符将被写出;否则,该字符将被排除。

pr 文件打印准备

tr

tr [ -c | -cds | -cs | -C | -Cds | -Cs | -ds | -s ] [ -A ] String1 String2
tr { -cd | -cs | -Cd | -Cs | -d | -s } [ -A ] String1

若要将大括号转换为小括号,请输入:tr '{}' '()' < textfile > newfile
这便将每个 {转换成 (,并将每个 }转换成 )。所有其它的字符都保持不变。
若要将大括号转换成方括号,请输入:tr '{}' '\[]' < textfile > newfile
这便将每个 {转换成 [,并将每个 }转换成 ]。左方括号必须与一个 "\"转义字符一起输入。
若要将小写字符转换成大写,请输入:tr 'a-z' 'A-Z' < textfile > newfile
若要创建一个文件中的单词列表,请输入:
tr -cs '[:lower:][:upper:]' '[\n*]' < textfile > newfile
这便将每一序列的字符(除大、小写字母外)都转换成单个换行符。*
(星号)可以使 tr 命令重复换行符足够多次以使第二个字符串与第一个字符串一样长。

若要从某个文件中删除所有空字符,请输入:tr -d '\0' < textfile > newfile
若要用单独的换行替换每一序列的一个或多个换行,请输入:
tr -s '\n' < textfile > newfile
或
tr -s '\012' < textfile > newfile

若要以“?”(问号)替换每个非打印字符(有效控制字符除外),请输入:tr -c '[:print:][:cntrl:]' '[?*]' < textfile > newfile
这便对不同语言环境中创建的文件进行扫描,以查找当前语言环境下不能打印的字符。
要以单个“#”字符替换 <space> 字符类中的每个字符序列,请输入:tr -s '[:space:]' '[#*]'

http://www.cnblogs.com/wangkangluo1/archive/2012/05/31/2528059.html

bash 和sed

正则表达式的神坑

sed -r 后面就可以不专一了
如果不接-r,连+和(都需要专一

<<<和< <(这个只有在bash的时候才能用。所以不能用sh去执行。

grep

  1. OR
grep 'Tech\|Sales' employee.txt
grep -E 'pattern1|pattern2' filename
egrep 'pattern1|pattern2' filename
grep -e pattern1 -e pattern2 filename
  1. And
grep -E 'pattern1.*pattern2' filename
grep -E 'pattern1.*pattern2|pattern2.*pattern1' filename
grep -E 'pattern1' filename | grep -E 'pattern2'
  1. NOT
grep -v 'pattern1' filename
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,302评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,563评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,433评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,628评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,467评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,354评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,777评论 3 387
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,419评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,725评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,768评论 2 314
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,543评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,387评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,794评论 3 300
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,032评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,305评论 1 252
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,741评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,946评论 2 336

推荐阅读更多精彩内容