mender 正则表达式学习笔记Jun 15, 201316:55:32
-
-
正则表达式中的特殊符号
-
[:alnum:] 字母和数字,即0-9, A-Z, a-z
-
[:alpha:] 字母,即A-Z, a-z
-
[:lower:] 小写字母,即a-z
-
[:upper:] 大写字母,即A-Z
-
[:digit:] 数字,即0-9
-
[:xdigit:] 16进制的数字,即0-9, A-F, a-f
-
[:blank:] 空格或Tab
-
[:graph:] 除了空格和Tab以外的其他所有按键
-
[:space:] 任何可产生空白的字符,包括Tab, CR等
-
[:cntrl:] 键盘上的控制键,即CR, LF, Tab, Del等等
-
[:print:] 任何可被打印的字符
-
[:punct:] 标点符号,即: ” ' ? ! ; # $ 等
-
-
grep进阶选项
grep [-A] [-B] [--color=auto] '搜寻字符串' filename
-
-A 后面可加数字,表示除了列出该行,后续(after)的n行也列出来
-
-B 后面可加数字,表示除了列出该行,前面(befor)的n行也列出来
-
-
语系设定
正则表达式通常使用export LANG=C的语言设定
-
基础正则表达式字符
-
^word撷取行首为word的行
撷取行首为#的行
grep -n '^#' file
-
word$ 撷取行尾为word的行
撷取行尾为!的行
grep -n '!$' file
-
. 代表一定有一个任意字符
两个e中间一定有一个字符
grep -n 'e.e' file
-
\ 转义符
撷取含有单引号的行
grep -n '\'' file
-
* 将前面的字符重复零到无穷多个
找出含有es ess esss等的字符串
grep -n 'ess*' file (注意不是grep -n 'es*' file)
代表任意字符可以用 .*
-
[list] 括号里放的是待搜索的字符,可以写多个
例如‘a[afl]y' 代表 aay afy aly三种情况
-
[n1-n2] 里面列出想要撷取的字符范围
撷取含有数字的那些行
grep -n '[0-9]' file 或者
grep -n '[[:digit:]]' file 注意不是 grep -n '[:digit:]' file
-
[^list] list里列出不要的字符串或范围
撷取任何非小写字母开头的行
grep '^[^a-z][^a-z]* ' file
可以撷取出以下样式的结果
GNU is free air not free beer.
I like dog.
# I am Mender!
-
\{n,m\} 代表连续n到m个前一个RE字符
\{n\} 代表连续n个前一个RE字符
\{n,\} 代表连续n到无穷多个前一个RE字符
grep -n 'go\{2,3\}' file 可以找出 good gooogle 这样的行
grep -n 'go\{2\}' file 可以找出good google 这样的行
grep -n 'go\{2,\}' file 可以找出good gooogle goooooogle这样的行
-
-
sed工具
-
删除2~5行(包括2和5)
nl /etc/passwd | sed '2,5d'
-
在第2行后(即第三行)追加上”drink tea?”字样
nl /etc/passwd | sed '2a drink tea?'
-
在第2行前(即第一行)插入”drink beer?”字样
nl /etc/passwd | sed '2i drink beer?'
-
在第2行后追加多行,使用\
nl /etc/passwd | sed '2a Drink tea or \
drink beer?'
-
把2-5行的内容取代为 “No 2-5 number”
nl /etc/passwd | sed '2,5c No 2-5 number'
-
列出文件的5-7行
nl /etc/passwd | sed -n '5,7p'
-
数据替换's/old/new/g',可以使用正则表达式
删除文件中的#注释
cat /etc/man.config | sed 's/#.*$//g' | sed '/^$/d'
-
直接修改文件内容
将行尾的.换成!
sed -i 's/\.$/\!/g' file
-
sed 后面如果要接超过两个以上的动作时,每个动作前面要加-e才行
cat /etc/passwd | \
sed -e '4d' -e '6c no six line' > passwd.new
-
-
扩展的正则表达式
grep只支持基础的正则表达式,而egrep可以使用扩展的表达式
-
+ 重复一个或一个以上的前一个RE字符
egrep -n 'go+d' file 可以找出god good goooood …
使用基础正则表达式为grep -n 'goo*d' file
-
? 零个或一个前一个RE字符
egrep -n 'go?d' flie 可以找出 gd god
使用基础正则表达式为grep -n 'go\{0,1\}d' file
-
| 用或的方式查找出数个字符串
egrep -n 'mender|wangran|dog' file
-
() 找出群组字符串
egrep -n 'g(la|oo)d' file可以找出glad和good
-
()+多个重复群组判断
egrep 'A(xyz)+C' file 可以找出 Axyzxyz..C这样的字符串
-
-
printf 打印函数
printf '打印格式' 实际内容
-
awk工具
-
awk '条件1{动作1}条件2{动作2}..' file
-
注意,awk后续的所有动作是以单引号括住的,由于单引号和双引号必须成对,所以awk的格式内容如果要以print打印时,非变量的文字部分,包括printf中的格式控制都要用双引号来定义!
-
awk处理流程
-
读入第一行,并将第一行的资料填入$0, $1, $2...($0表示一整行,其他的表示一个field)
-
依据条件的限制,判断是否需要进行后面的动作;
-
做完所有的动作与条件;
-
若还有后续行的数据,则重复上面1~3的步骤,直到所有的数据都读完为止。
-
-
Awk的内建变量
-
NF 每一行($0)拥有的字段数
-
NR 目前awk所处理的是第几行数据
-
FS 目前的分隔符,默认是空格
以:来分割每一行,当第三栏小于10时,打印第三栏
cat /etc/passwd | awk 'BEGIN{FS=”:”} $3<10{print $1 “\t” $3}'
打印每人的成绩,并计算每人的总分,其中第一行是标题,第一列是姓名
cat score.txt | awk '\
NR==1{printf “%10s %10s %10s %10s %10s\n”, $1, $2, $3, $4, “Total”}\
NR>=2{total=$2+$3+$4;printf “%10s %10d %10d %10d %10.2f\n”, $1, $2, $3, $4, total}'
Name 1st 2nd 3th Total
VBird 23000 24000 25000 72000.00
DMTsai 21000 20000 23000 64000.00
Bird2 43000 42000 41000 126000.00
-
-
注意,在{}内的动作,如果需要多个指令时,可利用分号间隔,或者直接以enter键来隔开每个指令。
-
-
判断两个文档之间的差异 diff
diff [-bBi] from-file to-file
-b 忽略一行当中,仅有多个空白的差异(“about me”与“about me”是为相同)
-B 忽略空白行的差异
-i 忽略大小写差异
-
按字节去比较 cmp
cmp [-s] file1 file2
-s 将说有不同的字节处都列出来,因为cmp预设仅会输出第一个发现的不同点
-
打补丁patch
patch -pN < patch_file 更新
patch -R -pN < patch_file 还原
-p 后面可以接取消几层目录
-R 代表还原的意思
-
制作补丁文件
diif -Naur passwd.old passwd.new > passwd.patch
-
打补丁
patch -p0 < passwd.patch
-
-
打印文件pr
打印的时候会打出时间,路径,页码等
-