系列教程--Linux基础--11--文件描述符和正则表达式

本节概述

  文件描述符

  重定向

  管道

  正则表达式

环境准备

操作系统:Centos6.5、Centos7.2

一、文件描述符

  Linux 中一切皆文件。

内核利用文件描述符来访问文件,文件描述符是一个非负整数,打开现存文件或者新建文件时内核会返回一个文件描述符,后面便可使用返回的文件描述符来指定待读写的文件。

Linux 中三种标准输入输出:

STDIN:标准输入,如控制台等终端的输入。  文件描述符:0

STDOUT:标准输出,控制台等终端输出。 文件描述符:1

STDERR:标准错误输出,控制台等终端输出。文件描述符:2

二、重定向

重定向分为输出重定向和输入重定向。

大对数Unix系统命令从控制台终端接受输入并将产生的输出发送回控制台终端机,默认情况下命令从标准输入读入数据,从标准输出输出数据。

重定向命令列表:

命令

说明

command > file

将输出重定向到文件,会覆盖

command < file

将输入重定向到文件

command >> file

将输出追加到file,不覆盖

n > file

将文件描述符为n的输出重定向到文件

n >> file

将文件描述符为n的输出追加到文件

m >& n

将文件描述符为m的输出合并到文件描述符为n的输出

n <& m

将输入文件描述符为m的输入合并到输入文件描述符为n的输入

<< tag

将开始标记tag和结束标记tag之间的数据作为输入

1. 输出重定向

标准输出:

[root@localhost ~]# ls /root > file1   #覆盖

[root@localhost ~]# cat file1

dir1

dir2

file1

file3

new_test2.sh

passwd

test2.sh

test.sh

标准错误输出:

[root@localhost ~]# ls /root123 2> file1

[root@localhost ~]# cat file1

ls: cannot access /root123: No such file or directory

m >&n

[root@localhost ~]# ls /root123 2>&1 file2 #标准错误输出重定向到标准输出

ls: cannot access /root123: No such file or directory

file2

[root@localhost ~]# cat file2  #file2为空,因为内容重定向到了标准输出

&>

标准输出和标准错误输出全部重定向到文件中。

[root@localhost ~]# ls /root123 &> file2

[root@localhost ~]# cat file2

ls: cannot access /root123: No such file or directory

>>

输出重定向,追加内容,> 每次会覆盖文件中原有内容。

[root@localhost ~]# echo 123 > file1

[root@localhost ~]# cat file1

123

[root@localhost ~]# echo 456 >> file1

[root@localhost ~]# cat file1

123

456

2. 输入重定向

<

输入重定向。

[root@localhost ~]# wc -l /etc/passwd  #统计passwd文件行数

43 etc/passwd

<<

一般用于输入的内容重定向到文件中。

[root@localhost ~]# > file1  #清空文件file1

[root@localhost ~]# cat > file1<<EOF    #起始、结束符为EOF

> 123

> 456

> ...

> EOF  #输入结束

[root@localhost ~]# cat file1

123

456

...

三、管道描述符

简单说管道就是一个程序的标准输出作为另一个程序的标准输入。管道符 |

[root@localhost ~]# cat /etc/passwd  | wc –l  #passwd文件内容作为wc -l输入

43

与管道符相关的一个命令tee,即可将前一个程序的标准输入作为后一个程序的标准输入,而且会将第一个程序的输出同时打印到控制台终端。

[root@localhost ~]# cat /etc/passwd | tee file1 #写入file1的同时也进行打印

root:$1$tO58o/wI$Zjq/4M3ddUuZyDP4oSf00.:0:0:root:/root:/bin/bash

bin:x:1:1:bin:/bin:/sbin/nologin

daemon:x:2:2:daemon:/sbin:/sbin/nologin

adm:x:3:4:adm:/var/adm:/sbin/nologin

lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

sync:x:5:0:sync:/sbin:/bin/sync

shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

halt:x:7:0:halt:/sbin:/sbin/halt

四、正则表达式

正则表达式使用单个字符串来描述、匹配一些列符合某个语法规则的字符串,在Linux 命令、shell脚本以及各种编程语言的开发中经常使用,代码中一般简称为regex、regexp、RE等。

正则表达式和通配符的区别:

  正则表达式用来查找文件内容、文本、字符串,以行位处理单位;通配符一般用来找文件名。

Linux中使用正则语法的命令主要有grep(egrep)、cut、awk、sed,同时这几个命令也是shell 脚本编写中经常使用到的命令,如软件的自动化安装、部署等。需要重点掌握,各种查找的语法不需要一定都记住,记住常用的,其他的用到时查询即可。

1. grep

查找顾虑工具,查找或者过滤出某个模式的字符串,可以和正则表达式搭配使用。

参数:

  -c  只输出匹配行的数量

  -i  匹配时忽略大小写

  -h  查询多个文件时不显示文件名

  -l  只列出符合匹配的文件名,不列出具体的匹配行

  -n  列出所有匹配行,并显示行号

  -s  忽略不存在 无匹配文本的错误信息

  -v  显示不包含匹配文件的行,即取反

  -w  匹配整词

  -x  匹配整行

  -r  递归搜索

通配符: 

符号

作用

*

任意长度字符

?

任意字符重复一次

[]

[]中任意字符

 

基础正则表达式:

符号

作用

*

前一个字符匹配0次或者多次

.

匹配除了换行符的任意一个字符。

^

匹配行首,^root匹配root开头的行

$

匹配行尾,bash$匹配以bash结尾的行

[]

匹配[ ]中任意一个字符,只匹配一个字符

[^]

匹配除[ ]中以外的任意字符,如[^0-9]匹配任意一个非数字字符

\

转义字符,将特殊符号转为正常字符

{n}

前面的字符出现n次,[0-9]{4}匹配4位数字,[1][3-8][0-9]匹配手机号

{n,}

前面的字符出现次数不少于n,[0-9]{4,}两位或多于两位的数字

{n, m}

表示前面的字符最少出现n次,最多出现m次,[0-9]{1,4}匹配0-9999

举例:

最常用法:

[root@localhost ~]# grep "root" passwd  #搜索passwd中包含root的行

root:$1$tO58o/wI$Zjq/4M3ddUuZyDP4oSf00.:0:0:root:/root:/bin/bash

operator:x:11:0:operator:/root:/sbin/nologin

显示行号: -n

[root@localhost ~]# grep -n "root" passwd

1:root:$1$tO58o/wI$Zjq/4M3ddUuZyDP4oSf00.:0:0:root:/root:/bin/bash

10:operator:x:11:0:operator:/root:/sbin/nologin

^word

^ 代表开头,^word即以word开头的行。

[root@localhost ~]# grep "^root" passwd –color  #--color关键字加亮

root:$1$tO58o/wI$Zjq/4M3ddUuZyDP4oSf00.:0:0:root:/root:/bin/bash

word$

$代表结尾,word$即以word结尾的行。
 [root@localhost ~]# grep "bash$" passwd --color

root:$1$tO58o/wI$Zjq/4M3ddUuZyDP4oSf00.:0:0:root:/root:/bin/bash

user1:x:1001:1001::/home/user1:/bin/bash

git:x:1002:1002::/home/git:/bin/bash

user3:x:1004:1004::/usr/user3:/bin/bash

user6:x:1005:1007::/home/user6:/bin/bash

word*

重复前一个字符大于等于0次。

      grep "roo*" passwd –color

    

[字符集合]

字符集合中列出的为想要选择的字符。

[root@localhost ~]# grep roo[ta] passwd

root:$1$tO58o/wI$Zjq/4M3ddUuZyDP4oSf00.:0:0:root:/root:/bin/bash

operator:x:11:0:operator:/root:/sbin/nologin

[^字符集合]

匹配不含[ ]中字符的行。

grep ^[^abgrsu] passwd     #不以a、b、g、r、s、u开头的行

空白行

grep "^$" passwd

单词精确匹配

格式:grep “\<字符\>” 文件名

举例:

[root@localhost ~]# grep "\<root\>" passwd

root:$1$tO58o/wI$Zjq/4M3ddUuZyDP4oSf00.:0:0:root:/root:/bin/bash

operator:x:11:0:operator:/root:/sbin/nologin

匹配到的行中root为单独的单词,不是某个词的一部分。

2. cut

grep 命令只要用来提取满足条件的行,cut和awk只要用来提取符合条件的列。

cut擅长处理间隔为一个字符的数据,如果间隔为多个字符使用cut处理较麻烦。

参数:

  -f  提取第几列

  -d  指定分割符,按照指定的分割符提取列,默认分隔符为制表符tab。

  -b  以字节为单位进行分割,这些字节位置将忽略多字节边界,除非也指定了-n标志

  -c  以字符为单位进行分割

  -n  取消分割多字节字符,仅和-b一起使用

举例:

提取多列

提取以冒号为分隔符的1-2列:

[root@localhost ~]# cut -f 1,2  -d ":" passwd

root:$1$tO58o/wI$Zjq/4M3ddUuZyDP4oSf00.

bin:x

daemon:x

adm:x

mail:x

–b , 按字节分割

提取每行的第一个字节:

[root@localhost ~]# cut -b 1  passwd

r

b

d

–c,以字符分割

提取每行1-4个字符:

[root@localhost ~]# cut -c 1-4 passwd

root

bin:

daem

adm:

3. awk

awk 不仅仅是一个命令,同时是一种便于使用且表达能力很强的程序设计语言,可应用于各种计算和数据处理任务。awk 内容很多,完整内容需要一本书来描述,感兴趣的同学可以参考《awk程序程序设计语言》、《sed与awk》等进行学习。

awk 名称是由他的创始人Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首个字母组成。

简单说awk就是一种用于文本处理的编程语言,任何awk语句都由模式和动作组成,一个awk脚本可以有多个语句,模式决定动作语句的触发条件和触发时间。

awk 相对比较复杂,所以一般建议能使用cut命令实现的功能尽量使用cut去实现,cut命令不能实现的话再考虑使用awk实现。本节只是介绍下awk的常用方式。

特殊字段:

  BEGIN:进行计数、打印头部信息,需要在任何action之前。

  END:输出统计结果,在完成动作之前执行。

格式:awk '{pattern + action}' {filenames}

               awk有些操作会很复杂,但是他们的语法是一样的。其中pattern为awk需要查找的内容,action为找到匹配的内容时执行的命令,{}用于对指令进行分组。

参数:

  -F  指定分隔符,默认为空格

  -f  加载awk脚本

  -

举例:

输出以冒号为分隔符的第一个域

[root@localhost ~]# cat passwd | awk -F ':' '{print $1}'

root

bin

daemon

输出以冒号分割的前两个域,以tab分隔

[root@localhost ~]# cat passwd | awk -F ':' '{print $1"\t"$2}'

root  $1$tO58o/wI$Zjq/4M3ddUuZyDP4oSf00.

bin    x

daemon   x

adm  x

BEGIN….END

先执行BEGIN,输出BEGIN指定的信息,然后执行action输出匹配的信息,最后执行END,输出END指定的信息。

     [root@localhost ~]# cat passwd | awk -F ':' 'BEGIN {print "begin awk..."} {print $1, $2} END {print "awk end..."}'

begin awk...

root $1$tO58o/wI$Zjq/4M3ddUuZyDP4oSf00.

bin x

user3 x

user6 x

awk end...

4. sed

sed命令主要用于对数据进行选取、替换、新增。类似于文件编辑工具vim,但是vim需要打开文件进行操作,即vim不能接收管道数据,sed可以接收管道的内容,同时也适用shell脚本的批量修改。

参数:

  -n  只将sed处理的行输出到屏幕,默认会输出全部的数据

  -e  允许对输入的数据应用到多条sed命令

  -i  直接对目标文件的内容进行修改,常用于脚本中修改配置文件。

  -a  匹配后追加信息

  -d  删除

  -p  打印

  -w  另存

  -s  查找

  -c  替换

举例:

列出文件某一行

列出第行:

[root@localhost ~]# sed -n "1p" passwd  #p为打印

root:$1$tO58o/wI$Zjq/4M3ddUuZyDP4oSf00.:0:0:root:/root:/bin/bash

2.5-14

[root@localhost ~]# sed -n "1,2p" passwd

root:$1$tO58o/wI$Zjq/4M3ddUuZyDP4oSf00.:0:0:root:/root:/bin/bash

bin:x:1:1:bin:/bin:/sbin/nologin\

列出文件第2行和后续的2行

[root@localhost ~]# sed -n "2,+2p" passwd

bin:x:1:1:bin:/bin:/sbin/nologin

daemon:x:2:2:daemon:/sbin:/sbin/nologin

adm:x:3:4:adm:/var/adm:/sbin/nologin

–i,对文件直接修改

将root替换为ROOT,默认只替换第一处。

[root@localhost ~]# sed -i "s/root/ROOT/" passwd   # s为查找

[root@localhost ~]# cat passwd

ROOT:$1$tO58o/wI$Zjq/4M3ddUuZyDP4oSf00.:0:0:root:/root:/bin/bash

bin:x:1:1:bin:/bin:/sbin/nologin

            …

删除空行

passwd文件中加入几行空行。

sed -i "/^$/d" passwd

五、拓展

1. 利用sed将文件passwd中的root全部替换为ROOT。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值