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}

posted @ 2022-03-10 00:02  万溪汇海  阅读(52)  评论(0编辑  收藏  举报