一、正则表达式
linux的正则主要分为基础正则和拓展正则,基础的正则如下:
1.正则匹配时会最大化匹配结果
正则表达式由于其贪婪匹配的逻辑,会将结果进行最大化匹配,经常书写出的正则会超出我们的需要,所以书写时我们要用定界符到,如/etc/passwd文件中的第一列为用户名,用冒号分隔,后面都跟x,如果我们简单的以:作为分隔符,正则或最大化匹配结果,匹配到最后一个x,但我们可以如果用:x:来做定界符,就能精确定位到我们想要的结果
2.转义字符的使用
正则中,只要不是想要搜索的符号,就必须加\转义字符将其转换为原本的意思,如上表中的 ma(tri)?,[0-9]{3}等正则例子,实际书写时都要加转义字符,写为“ma\(tir\)\?”和'[0-9]\{3\}',而同样,如果想搜索的符号中有* ?之内的正则表达符号,也要加转义字符才能代表原本的符号含义.
3.[]的注意事项
[a-zA-Z]代表包含大小写的所有单个字母,不能写成[a-Z];
[a-z_-]代表匹配字母或下划线或横杠,不能写成[a-z-_]
4.写正则时需要不断试错
即便写出了匹配的正则表达式,用定界符进行精准匹配后,正则中仍然会出现结果不符合要求的情况,需要对表达式不断修改,不断试错,才能得到想要的结果
二、grep 命令
所有参数:
常见用法:
1. -b -o 统计字符串的偏移量(即一行中相对行首的位置差)
echo gun is not unix | grep -b -o "not"
7:not
#一行中字符串的字符偏移是从该行的第一个字符开始计算,起始值为0。选项 -b -o 一般总是配合使用。
2.-l和-L 在多文件查找时,仅输出符合条件/不符合条件的文件的文件名,不输出内容
3.-f 和字符串匹配,正则式匹配不同,将单独的文件作为匹配样式,每一个匹配的样式为一行
#在样式文件中逐行写出需要匹配的字符。
cat patfile
aaa
bbb
echo aaa bbb ccc ddd eee | grep -f patfile -o
4.-A -B -C 除了输出匹配内容外,还输出匹配内容上/下/上下行的内容,可以指定几行
#如果匹配结果有多个,会用“--”作为各匹配结果之间的分隔符:
echo -e "a\nb\nc\na\nd\nc" | grep a -A 1
a
b
--
a
d
5. -q 静默输出,不会输出任何信息,如果命令运行成功返回0,失败则返回非0值。一般用于条件测试。
6.--include 排除目标文件
1)--include *{.c,.cpp} 仅仅在文件夹中搜索.c和.cpp文件;
2)--exclude "README" 排除全部README文件
3) --include-dir 仅在某些文件夹中搜索
4) --exclude-dir 排除某些文件夹
5) --exclude-from FILE 从文件FILE中读取须要排除的文件列表
#只在目录中所有的.php和.html文件中递归搜索字符"main()"
grep "main()" . -r --include *.{php,html}
#在搜索结果中排除所有README文件
grep "main()" . -r --exclude "README"
#在搜索结果中排除filelist文件列表里的文件
grep "main()" . -r --exclude-from filelist
三、cut:字段简单剪切命令
该命令有两项功能,其一是用来显示文件的内容,它依次读取由参数file所指明的文件,将它们的内容输出到标准输出上;其二是连接两个或多个文件,如cut fl f2 > f3将把文件fl和几的内容合并起来,然后通过输出重定向符“>”的作用,将它们放入文件f3中。
1.格式
cut(options)(参数)
2.全部参数
3.常见用法
#学生报表信息,包含No、Name、Mark、Percent:
[[email protected] text]# cat test.txt
No Name Mark Percent
01 tom 69 91
02 jack 71 87
03 alex 68 98
#使用 -f 选项提取指定字段:
[[email protected] text]# cut -f 1 test.txt
No
01
02
03
[[email protected] text]# cut -f2,3 test.txt
Name Mark
tom 69
jack 71
alex 68
#--complement 选项提取指定字段之外的列(打印除了第二列之外的列):
[[email protected] text]# cut -f2 --complement test.txt
No Mark Percent
01 69 91
02 71 87
03 68 98
#使用 -d 选项指定字段分隔符:
[[email protected] text]# cat test2.txt
No;Name;Mark;Percent
01;tom;69;91
02;jack;71;87
03;alex;68;98
[[email protected] text]# cut -f2 -d";" test2.txt
Name
tom
jack
alex
注意:cut的分隔符,默认为制表符,可以-d指定其他分隔符,但是不能指定空格(-d " ")!,即如果文本内容以空格分隔,cut会认为文本只有一列
四、sed:功能强大的流式文本编辑器
格式:
sed [options] 'command' file(s)
sed [options] -f scriptfile file(s)
重要参数:
-n :即--slient和 -quiet 静默输出 只打印脚本或command处理过行
-e :直接在命令行模式上进行sed动作编辑,此为默认选项
-f :将sed的动作写在一个文件内,用–f filename 执行filename内的sed动作
-r :支持扩展正则表达式
-i :直接修改文件内容,不输出到屏幕
sed command:
注意:
- sed命令中,字符串或正则的两边需要加上双斜杠// 如添加动作:‘/正则式/i’
- sed '2,4d' 将2-4行内容删除,而不是删除第2行和第4行
- sed 's/book/BOOKS/g' file g是全局参数,不加只替换第一个
- &的用法 已匹配字符串标记
echo this is a test line | sed 's/\w\+/[&]/g' [this] [is] [a] [test] [line]
- \1的用法,子串匹配标记
echo this is digit 7 in a number | sed 's/digit \([0-9]\)/\1/' this is 7 in a number
- r/w 从文件读入,或写入到文件(前者不改变文件内容,后者改变)
#将匹配内容显示在匹配行下 sed '/test/r file' filename #在example中所有包含test的行都被写入file里: sed -n '/test/w file' example
- q 中途退出命令
#打印完第10行后,退出sed sed '10q' file
五、awk:文本和数据进行处理的编程语言
(awk命令比较复杂,涉及到编程思想和逻辑判断,仅总结目前知识水平范围内的内容)
1.awk的模式(patten)和操作(command)
模式可以是以下任意一个:
- /正则表达式/:使用通配符的扩展集。
- 关系表达式:使用运算符进行操作,可以是字符串或数字的比较测试。
- 模式匹配表达式:用运算符
(匹配)和~
(不匹配)。~!
- BEGIN语句块、pattern语句块、END语句块(即拓展commend,一般在BEGIN中赋值,申明等,END中进行操作,运算等,BEGIN和END不参与逻辑循环)
操作由一个或多个命令、函数、表达式组成,之间由换行符或分号隔开,并位于大括号内,主要部分是:
- 变量或数组赋值
- 输出
- 内置函数
- 控制流语句
2. 内置参数(变量)
-
$0,$1,$2 列数,从0开始(默认空格和制表符为分隔符,-F或fs==指定分隔符)
awk '{printf $1}' //打印第一个字母
- NR,NF 行号和字段数
- FILENAME 文件名
- 完整的内置参数如下:
3.逻辑处理
作为一种程序设计语言所应具有的特点之一,awk支持多种运算,这些运算与C语言提供的基本相同。awk还提供了一系列内置的运算函数(如log、sqr、cos、sin等)和一些用于对字符串进行操作(运算)的函数(如length、substr等等)。
运算符 | 描述 | 举例 |
+ - | 加,减 | awk 'BEGIN{a="b";print a++,++a;}' 输出:0 2 (注意:所有用作算术运算符进行操作,操作数自动转为数值,所有非数值都变为0) |
* / & | 乘 除 求余 | |
++ -- | 增加和减少(作为前缀和后缀) | |
> >= != == | 关系运算符 (注意:> < 可以作为字符串比较,也可以用作数值比较,关键看操作数如果是字符串就会转换为字符串比较。两个都为数字才转为数值比较。字符串比较:按照ASCII码顺序比较。) | awk 'BEGIN{a=11;if(a >= 9){print "ok";}}' 输出:ok |
= += -= *= ... | 赋值语句 | a+=5; 等价于:a=a+5; 其它同类 |
|| && | 逻辑或,逻辑与 | awk 'BEGIN{a=1;b=2;print (a>5 && b<=2),(a>5 || b<=2);}' 输出:0 1 |
~ ~! | 正则表达式的匹配和不匹配 | awk 'BEGIN{a="100testa";if(a ~ /^100*/){print "ok";}}' 输出:ok |
?: | C条件表达式 | awk 'BEGIN{a="b";print a=="b"?"ok":"err";}' 输出:ok |
in | 数组中是否存在键值 | awk 'BEGIN{a="b";arr[0]="b";arr["b"]="c";print (a in arr);}' 输出:1 |
4.拓展格式
拓展格式如下:
awk [options]'BEGIN{print"START"}pattern{commands}END{print "END"}'
一般在BEGIN中赋值,申明等,END中进行操作,运算等,BEGIN和END不参与逻辑循环
awk -F ':' 'BEGIN{print "Line Col User"}{print NR" ",NF" ",$1}END{print"--------"FILENAME"------------"}' /etc/passwd |more
#显示每行的行号,列数(用:作为分隔符)并在表头和结束打印相关内容
5.与sed的比较
awk和sed都是流式文本数据处理命令,都支持管道操作,一般什么情况选择sed,什么情况选择awk呢?
1.两个命令都是行处理命令,具体的逻辑是一次读入一行内容,然后处理一行内容,处理完成后又处理下一行内容
2.和sed相比,同样是对一行的内容进行操作,awk可以进行切片处理,分‘列’进行处理(根据分隔符将一行拆分成多列,如使用内置参数$1 ,$2可对第2列和第3列进行提取操作)
3.sed命令对复杂正则的匹配度较高,在处理正则的复杂匹配和精确匹配时,建议优先考虑使用sed命令
4.awk命令由于可以进行逻辑处理和流程控制,在对文本的操作逻辑性较强时,推荐优先考虑awk命令
参考内容:
https://www.cnblogs.com/tlnshuju/p/7106790.html grep命令最经常使用的功能总结
http://man.linuxde.net/sed sed命令_Linux sed 命令用法详解:功能强大的流式文本编辑器
http://man.linuxde.net/awk awk命令_Linux awk 命令用法详解:文本和数据进行处理的编程语言
https://www.imooc.com/learn/819 实例妙解Sed和Awk的秘密