您的位置:首页 > 运维架构 > Linux

linux备忘录-正则表达式与文件格式化处理

2017-08-14 15:35 351 查看

正则表达式

POSIX标准的符号

[:alnum:] -> 英文大小写字母和数字 0-9,A-Z,a-z

[:alpha:] -> 英文大小写字母 A-Z,a-z

[:blank:] -> 空格键的tab键

[:cntrl:] -> 键盘上的控制按键CR LF Tab Del等

[:digit:] -> 数字 0-9

[:graph:] -> 除了空格符和tab外的其他所有按键

[:lower:] -> 小写字母a-z

[:print:] -> 任何可以打印出来的字符

[:punct:] -> 代表标点符号: * ` ? ! ;:#$等

[:upper:] -> 大写字母A-Z

[:space:] -> 任何产生空白的字符 空格键 tab CR等

[:xdigit:] -> 16进制数值类型0-9,A-F,a-f

正则表达式一些规则


. -> 代表任意一个字符

[abc] -> 代表字符abc中的一个

[a-z] -> 代表字符a-z中的一个

[^abc] -> 代表不能出现abc中的一个

^abc -> 代表必须以a开头,同时bc在后面,即必须abc开头

abc$ -> 代表必须以c结尾,同时bc在前面,即必须abc结尾

.$ -> 代表必须以.结尾

^$ -> 代表空白行

\ -> 代表进行转义



-> 代表重复前面0次到无穷多次

{m} -> 代表出现m遍

{m,n} -> 代表出现m到n遍

{m,} -> 代表出现至少m遍


扩展正则表达式


+ -> 代表重复前面至少一次

? -> 代表重复前面0次或1次

| -> 代表两个正则表达式之间的或

() -> 代表群组

()+ -> 代表群组重复至少一次


其他散乱知识

runlevel3 和 runlevel5的开机启动脚本分别放置在 /etc/rc3.d/etc/rc5.d

命令

grep [-A] [-B] [--color=auto] '搜寻字符串' filename


grep -A n 同时显示后n行

grep -B n 同时显示前n行

grep -n 显示行号

grep -i 忽略大小写

grep -v 反向搜寻

grep -E 使用扩展正则表达式

grep --color=auto 高亮显示

dmesg | grep 'eth' 命令dmesg可以列出内核产生的信息

dmesg | grep '[^[:lower:]]

dmesg | grep -v '^$' | grep -v '^#' 不是空白行,同时不是以#号开头

echo "ooo" | grep -n 'ooo' 至少两个o

echo "123" | grep -n '[0-9][0-9]' 含数字

echo "oo" | grep -n 'o{2} 两个o

echo "oooo" | grep -n o{2,5} 两到五个o



sed (字符串编辑命令 string edit)


sed -n 只有经过处理的行才进行显示

sed -e 直接在指令模式进行动作编辑

sed -f filename 将sed的动作写在文件中进行调用

sed -r 支持扩展正则表达式

sed -i 直接修改读取的档案内容,而不是在屏幕输出

sed '[n1][,n2]function' 在n1-n2行进行function动作,最好用单引号''括住

function

-- a STR 在目前的下一行新增STR

-- c STR 用STR取代n1-n2行的内容

-- d 删除n1-n2行的内容

---- /正则表达式/d 通过正则表达式删除

-- i STR 在目前行的上一行插入STR

-- p 将数据打印到屏幕,与-n一起用

-- s/word1/word2/g 在n1-n2行用word2取代word1,可以使用正则表达式

例子

ls /etc/passwd | sed '2,5c no.2-5 replace' 取代2-5行为no.2-5 replace

ls /etc/passwd | sed -n '5,7p' 显示5-7行,或者head -n 20 | tail -n 10

sed -i '$a #hello' file.txt 直接在file.txt后面加上#hello

cat /etc/passwd | sed -e '4d' -e '6c no six line' > passwd.new 第四行删除,第6行替换



egrep (扩展正则表达式)

printf (格式化打印)


printf '打印格式' 实际内容

printf '\x45\n' 将16进制表示的45转换成ascii码表示的字符



awk (好用的数据处理工具,awk处理每一行字段内的数据)


awk '条件类型1{动作1} 条件类型2{动作2}...' filename

相关变量

-- $0 代表一整行

-- $n 代表第n个字段

-- NF 每一行拥有的字段总数

-- NR 目前处理的是第几行

-- FS 目前的分割字符

逻辑运算符

-- C语言的常规逻辑运算符 > < >= <= == !=

awk动作内支持if

last -n 5 | awk '{print $1 "\t" $3}' 打印出第1和第3个字段,中间以\t

cat file | awk '{print $1 "\t line:" NR "\t column" NF}'

cat /etc/passwd | awk '{FS=":"} $3<10{print $1 "\t" $3}' 第一行执行后指定分隔符为:,第三栏小于10时,打印第一栏和第三栏

cat /etc/passwd | awk 'BEGIN {FS=":"} $3<10{print $1 "\t" $3}' 预先设定awk的分隔符

cat /etc/passwd | awk 'NR==1{varname=hello printf "%10s" hello} NR>=2{变量=1 printf "%10s" 变量}' 变量不需要加$

cat /etc/passwd | awk '{if(NR==1) print "hello"}'



diff (比较档案的不同,主要以行进行比对)


diff [-bBi] fromfile tofile

-- fromfile 或 tofile 用 -取代,代表stdin

diff -b 忽略一行当中只有多个空白的差异

diff -B 忽略空白行的差异

diff -i 忽略大小写的差异

diff -Naur file.old file.new > file.path 制作补丁档案

diff /etc/rc3.d/ /etc/rc5.d/ 可以比对目录下文件的不同



cmp (以字节比对档案的不同)


cmp [-s] file1 file2

cmp -s 列出所有的不同点,默认只列出一个不同点



patch (旧档案更新成新档案,或还原,类似于打补丁)


patch -pN < patch_file 进行更新

patch -R -pN < patch_file 进行还原

patch -pN 取消N层目录的意思

patch -R 代表还原

patch -p0 < file.patch



pr (linux下的打印命令)

例子


grep '*' /etc/* 搜寻/etc下含有号的文件

grep '*' $(find /etc -type f) 搜寻/etc下及其子目录下含有号的文件

find / -type f | xargs -n 10 grep '*' 找到后每次丢10个给grep处理


参考


鸟哥的Linux私房菜 第三版

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: