系列教程--Linux基础--11--文件描述符和正则表达式
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了系列教程--Linux基础--11--文件描述符和正则表达式,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含9448字,纯文字阅读大概需要14分钟。
内容图文
本节概述
文件描述符
重定向
管道
正则表达式
环境准备
操作系统: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。
内容总结
以上是互联网集市为您收集整理的系列教程--Linux基础--11--文件描述符和正则表达式全部内容,希望文章能够帮你解决系列教程--Linux基础--11--文件描述符和正则表达式所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。