Linux三剑客与管道使用
1 管道
什么是管道:
linux提供管道符“|”将两个命令隔开,管道符左边命令的输出就会作为管道符右边命令的输入
示例:echo “hell0 1234”|grep ‘hello’
2 正则表达式
正则表达式就是记录文本规则的代码
举例
hi单词后面有lucy单词
hi 123wo lucy 321 :\bhi\b.*lucy\b
以0开头,然后两个数字,然后连字符“-”最后8个数字
020-66789023 0\d{2}-\d{8}
手机号码
18890012345 1[\d]{10}
电子邮件
lili@163.com \w+([- +.]\w)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
规则:
[…...] 匹配括号中任何一字符
[^…...] 匹配不在括号中的任何一字符
\w 匹配(a~z,A~Z,0~9)
\W 匹配任何一个空白字符
\s 匹配任何一个非空白字符
\S 与任何非单词字符匹配
\d 匹配任何一个数字
\D 匹配任何一个非数字
[\b] 匹配一个退格键字母
{n,m} 最少匹配前面表达式n次,最大为m次
{n,} 最少匹配前面表达式n次
{n} 正好匹配前面表达式n次
? 匹配前面表达式0或1次
+ 最少匹配前面表达式1次
* 最少匹配前面表达式0次
| 匹配前面或后面表达式
(…) 在单元中组合项目
^ 匹配字符串开头
$ 匹配字符串结尾
\b 匹配字符边界
\B 匹配非字符边界的某个位置
3 grep
定义:根据用户指定的模式(pattern)对目标文本进行过滤,显示被模式匹配到的行
命令形式:grep[选项]PATTERN[FILE…]
选项:
-v 显示不被pattern匹配到的行
-i 忽略字符大小写
-n 显示匹配的行号
-c 统计匹配的行数
-o 仅显示匹配到的字符串
-E 使用ERE,相当于egrep
例如
1、 查找文件内容包含root的行数
grep –n root test.txt
2、 查找文件内容不包含root的行
grep –nv root test.txt
3、 查找以s开头的行
grep ^s test.txt
4、 查找以n结尾的行
grep n$ test.txt
4 sed
命令形式:sed[-hn..][-e<script>][-f<script FILE>][FILE]
-h:显示帮助
-n:仅显示script处理后的结果
-e<script>以选项中指定的script来处理输入的文本文件
-f<script文件>以选项中指定的script文件来处理输入的文本文件
常用动作
a:新增 sed -e ‘4 a newline’ 在第四行后新增一行newline
c:取代 sed -e ‘2,5c No 2-5 number’ No 2-5 number取代2-5行的内容
d:删除 sed -e ‘2,5d’ 删除2到5行的内容
i:插入 sed -e ‘2i newline’ 在第二行前面插入newline
p:打印 sed -n ‘/root/p’ 打印匹配到root行的内容
s:取代 sed -e ‘s/old/new/g’ 用new取代old
实战
查看帮助
man sed
sed –h
在第四行后添加新字符串
sed –e ‘4 a newline testfile’ test.txt
全局替换
sed –e ‘s/root/hello/g’ test.txt
直接修改文件内容
sed -i ‘s/root/hello/g’ test.txt
5 awk
定义:把文件逐行读入,以空格为默认分隔符将每行切片,切开的部分再进行后续的处理
命令形式:awk ’pattern+action ’ [FILE]
-pattern 正则表达式
-action对匹配到的内容执行命令(默认为输出每行内容)
常用参数
FILENAME awk浏览的文件名
BEGIN 处理文本之前要执行的操作
END 处理文本之后要执行的操作
FS 设置输入域分隔符,等价于命令行-F 选项
NF 浏览记录的域的个数(列数)
NR 已读记录数(行数)
OFS 输出域分隔符
ORS 输出记录分隔符
RS 控制记录分隔符
$0 整条记录
$1 表示当前行的第一个域……以此内推
实战
搜索etc/passwd有关root关键字的所有行,并显示对应的shell
awk –F:’/root/{print $7}’/tec/passwd
打印/etc/passwd/的第二行信息
awk -F :’NR==2{print$0}’ /etc/passwd
使用begin加入标题
awk ‘BEGIN {print “BEGIN”,”Begin”} {print $1,$2}’ /etc/passwd
自定义分隔符
echo “111 222|333 444|555 666” | awk BEGIN{RS=”|”}{print $0}