Linux 学习之路(四):管道、重定向、正则

管道及IO重定向

运算器、控制器:CPU

存储器:RAM

输入设备/输出设备

程序:指令和数据

控制器:指令

运算器:

存储器:

地址总线:内存寻址

数据总线:传输数据

控制总线:控制指令

寄存器:CPU暂时存储器

I/O:硬盘

系统设定

​ 默认输出设备:标准输出,STDOUT,1

​ 默认输入设备:标准输入,STDIN,0

​ 标准错误输出:STDERR,2

标准输入:键盘

标准输出和错误输出:显示器

I/O重定向:

​ 改变数据的输入/输出来源

  • 输出重定向: > 覆盖输出

​ >> 追加输出

​ 重定向错误输出:2>

​ 追加方式: 2>>

​ 重定向标准输出或错误输出至同一个文件: &>

ls /var > /tmp/var.out
#set -C:禁止对已经存在文件使用覆盖重定向
shell内置命令:set -C 开启功能 +C 关闭功能
#不关闭禁止覆盖输出的功能,同时覆盖输出
ls /var >| /tmp/var.out

既定向正确输出,也定向错误输出:

ls /varr > /tmp/var3.out 2> /tmp/err.out
ls /var6 &> /tmp/var5.out
  • 输入重定向:<
#tr本不支持文件,通过输入重定向将文件中小写变大写
tr 'a-z' 'A-Z' < /etc/fstab

Here Document:<< 在此处生成文档

[root@localhost ~]# cat << END
> The first line.
> The second line.
> END
The first line.
The second line.

cat << EOF

#用户从键盘输入数据并保存在文件中,用于在脚本中生成文件
cat >> /tmp/myfile.txt <<EOF

管道:

前一个命令的输出,作为后一个命令的输入

命令1 | 命令2 |命令3 |…

[root@localhost ~]# echo "hello,world." | tr 'a-z' 'A-Z'
HELLO,WORLD.
#取出所有用户名并排序
[root@localhost ~]# cut -d: -f1 /etc/passwd|sort
#既输出到屏幕,也保存到文件
[root@localhost ~]# echo "Hello World." | tee /tmp/hello.out
Hello World.
[root@localhost ~]# cat /tmp/hello.out
Hello World.
#显示文件行数,且不能显示其他信息
wc -l /etc/passwd 显示文件的行数
[root@localhost ~]# wc -l /etc/passwd | cut -d' ' -f1
50
[root@localhost ~]# ls /usr/bin|wc -l
1922
[root@localhost ~]# ls -l /usr/bin |head -1
总用量 242488

练习:

1.统计/usr/bin/目录下的文件个数

[root@localhost ~]# ls /usr/bin|wc -l
1922

2.取出当前系统上所有用户的shell,要求,每种shell只显示一次,并且按顺序进行显示。

[root@localhost ~]# cut -d: -f7 /etc/passwd | sort -u
/bin/bash
/bin/sync
/sbin/halt
/sbin/nologin
/sbin/shutdown

3.思考:如何显示/var/log目录下每个文件的内容类型?

4.取出/etc/inittab文件的第6行

[root@localhost ~]# head -6 /etc/inittab | tail -1
#

5.取出/etc/passwd文件中倒数第9个用户的用户名和shell,显示到屏幕上并将其保存至/tmp/users文件中

[root@localhost ~]# tail -9 /etc/passwd | head -1 |cut -d: -f1,7 |tee /tmp/users

6.显示/etc目录下所有以pa开头的文件,并统计其个数

[root@localhost ~]# ls -d /etc/pa* | wc -l
3

7.不使用文本编辑器,将alias cls=clear一行内容添加至当前用户的.bashrc文件中。

#printf "alias cls=clear" >> ~/.bashrc

grep以及正则表达式

文本查找的需要:

grep,egrep,fgrep

grep:根据模式,搜索文本,并将符合模式的文本行显示出来。

Pattern:文本字符和正则表达式的元字符组合而成的匹配条件

grep [OPTIONS] PATTERN [FILE…]

​ -i 忽略大小写

​ --color 以颜色显示

​ -v反向查找:显示没有被模式匹配到的行

​ -o只显示被模式匹配到的字符串

#匹配到的字符串用颜色显示出来
[root@localhost ~]# grep --color 'root' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@localhost ~]# grep -o 'root' /etc/passwd
root
root
root
root

正则表达式:

元字符:

.:匹配任意单个字符

匹配次数(贪婪模式):

*****:匹配其前面的字符任意次

.*:任意长度的任意字符

?:匹配其前面的字符1次或0次

grep 中有部分匹配就可以

\{m,n\}:匹配其前面的字符至少m次,至多n次

[]:匹配指定范围内的任意单个字符

[^]:匹配指定范围外的任意单个字符

字符集:[:digit:],[:lower:],[​:upper:],[:punct:],[:space:],[:alpha:],[:alnum:]

位置锚定:

^:锚定行首,此字符后面的任意内容必须出现在行首

$:锚定行尾,此字符前面的任意内容必须出现在行尾

^$:空白行

\<或\b:锚定词首,其后面的任意字符必须作为单词首部出现

\>或\b:锚定词尾,其前面的任意字符必须作为单词的尾部出现

#表示root出现在词尾
grep "\broot" test2.txt

分组:

\(\)

​ \(ab\)* 后向引用

​ \1:第一个左括号以及与之对应的右括号所包括的所有内容

grep '\(1..e\).*\' test3.txt
test3.txt
  1 He love his lover.
  2 She like her lover.
  3 He like his liker.
  4 She love her liker.

[root@localhost ~]# grep '\(l..e\).*\1' test3.txt
He love his lover.
He like his liker.

正则表达式:

​ Basic REGEXP:基本

​ Extended REGEXP:扩展

grep:使用基本正则表达式定义的模式来过滤文本的命令

​ -E : 使用扩展正则表达式

​ -A #:显示模式匹配到的那一行以及后面的#行

​ -B 前面行

​ -C 上下若干行

[root@localhost ~]# grep -A 2 '^core id' /proc/cpuinfo
core id		: 0
cpu cores	: 1
apicid		: 0

扩展正则表达式:

字符匹配:

.

[]

[^]

次数匹配:

*:

?:其前字符一次或0次

+:匹配其前字符至少一次

{m,n}

位置锚定与正则表达式相同

分组:

():分组

\1,\2,\3,…

或者

|:or

(C|c)at:cat/Cat

grep -E =egrep

找ifconfig命令显示结果中1-255的数字:

ifconfig|egrep --color '\<([1-9]|[1-9]|[0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>'

找出ifconfig命令执行结果中的IP地址:

\.让元字符表示它本身含义

ifconfig|egrep --color '\<([0-9]|[1-9]|[0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>\.)(3)\<([0-9]|[1-9]|[0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>'

IPV4

5类:A B C D E

A:1-127

B:128-191

C:192-223

猜你喜欢

转载自blog.csdn.net/nicezheng_1995/article/details/83046610