文章目录
Linux-重定向、管道符、通配符、转义字符、环境变量
在学习了linux常见的命令之后,我们要学以致用!本篇博客就来介绍如何将linux常见的命令用起来,在这里我们假设常见的命令我们已经了如指掌,不熟悉的可以关注我,看我这篇博客Linux常见命令。
1. 输入输出重定向
1.1 文件描述符和分界符EOF
文件描述符: 每一个被进程打开的文件,都会被赋予一个非负整数用以标识该文件,即文件标识符。
# 每个进程都会打开的三个文件,文件标识符为0、1、2
0 STDIN 标准输入 键盘
1 STDOUT 标准输出 显示器
2 STDERR 错误输出 显示器
# 在一个终端上打开/etc/passwd文件,在另一个终端上查看进程情况。
# 查看某个进程的PID
[root@master ~]# ps aux | grep passwd
root 18841 1.1 0.2 151664 5388 pts/0 S+ 19:24 0:00 vim /etc/passwd
root 18856 0.0 0.0 112724 988 pts/1 S+ 19:24 0:00 grep --color=auto passwd
# 查看一个进程打开了哪些文件?
[root@master ~]# ll /proc/18841/fd
总用量 0
lrwx------. 1 root root 64 7月 13 19:25 0 -> /dev/pts/0 # 标准输入
lrwx------. 1 root root 64 7月 13 19:25 1 -> /dev/pts/0 # 标准输出
lrwx------. 1 root root 64 7月 13 19:24 2 -> /dev/pts/0 # 错误输出
lrwx------. 1 root root 64 7月 13 19:25 4 -> /etc/.passwd.swp
# 查看一个进程最多可以打开多少个文件
[root@master ~]# ulimit -n
1024
[root@master ~]# ulimit -n 2048
[root@master ~]# ulimit -n
2048
[root@master ~]# ulimit -n 1024
[root@master ~]# ulimit -n
1024
# EOF(End Of File)即文件的结束,分界符
<<EOF # 输入文档,当遇到EOF结束输入
<<aaa # 输入文档,当遇到aaa结束输入
# 可将整个结构体写入shell脚本中,再执行。
# 以下的写入和追加操作,可以不用vim,直接写入内容。
# 将查看的内容写入a.txt,输入eof则保存退出。
[root@master ~]# cat > a.txt <<eof
hahah
xixi
hhha
EOF
HHHH
eof
[root@master ~]# cat a.txt
hahah
xixi
hhha
EOF
HHHH
# 将查看的内容追加到a.txt,输入eof则保存退出。
[root@master ~]# cat >> a.txt <<eof
> ddd
> asfksd
> adsfkjd
> ajkhf
> eof
[root@master ~]# cat a.txt
hahah
xixi
hhhach
EOF
HHHH
ddd
asfksd
adsfkjd
ajkhf
[root@master ~]# vim eof.sh
#!/bin/bash
cat > b.txt <<eof
=====
hahah
xixxixi
=====
eof
[root@master ~]# ll eof.sh
-rw-r--r--. 1 root root 60 7月 14 00:06 eof.sh
[root@master ~]# chmod +x eof.sh
[root@master ~]# ll eof.sh
-rwxr-xr-x. 1 root root 60 7月 14 00:06 eof.sh
[root@master ~]# ./eof.sh
[root@master ~]# cat b.txt
=====
hahah
xixxixi
=====
# 以上说白了就是编辑文档,但是看起来很牛。用vim打开编辑保存退出也能达到同样的效果。。。。
1.2 输入重定向
标准输入重定向(STDIN,文件描述符0),是将文件作为输入,在工作中用的较少。
1.3 输出重定向
输出重定向分为两种,一种是标准输出重定向(STDOUT,文件描述符1),另一种是错误输出重定向(STDERR,文件描述符2)。
一个命令的输出,默认输出在屏幕上,当命令正常执行时,我们称输出为标准输出,但是当命令执行不当时,会报错,这时我们称输出的内容为错误输出。如下图:
那么,现在问题来了, 我们想要把这些原本输出到屏幕上的内容,输出到一个文件里,这时就需要重新定位输出的位置,也即是所谓的输出重定向。常见的输出重定向的命令如下:
命令 | 作用 |
---|---|
命令 > 文件 | 将标准输出写入文件 |
命令 2> 文件 | 将错误输出写入文件【2和>之间无空格】 |
命令 >> 文件 | 将标准输出追加到文件末尾 |
命令 2>> 文件 | 将错误输出追加到文件末尾【2和>>之间无空格】 |
命令 >> 文件 2>&1或命令 &>> 文件 | 将标准输出追加到文件末尾,错误输出和标准输出一样【即stdout和stderr都输出到文件】 |
命令 2>> 文件 1>&2或命令 &>> 文件 | 将错误输出追加到文件末尾,标准输出和错误输出一样【即stdout和stderr都输出到文件】 |
1.4 两个特殊文件:/dev/null文件和/dev/zero文件
# /dev/null 黑洞文件,查看无内容,可把不想输出到屏幕的输出重定向到该文件。
# 把错误输出写入到/dev/null
[root@master ~]# ll c.txt
ls: 无法访问c.txt: 没有那个文件或目录
[root@master ~]# ll c.txt 2> /dev/null
# /dev/zero 空文件,可以用来产生空白文件
[root@master ~]# dd if=/dev/zero of=c.txt bs=1M count=1
记录了1+0 的读入
记录了1+0 的写出
1048576字节(1.0 MB)已复制,0.00461717 秒,227 MB/秒
[root@master ~]# ll c.txt
-rw-r--r--. 1 root root 1048576 7月 14 00:19 c.txt
2. 管道符
符号: | 【Shift + \】
作用:连接两个或者多个命令,如【命令A | 命令B | 命令C】
将前一个命令的输出,作为后一个命令的输入。
如:
-
找出所有被限制登录系统的用户,并统计该类用户数
-
以分页方式查看/etc目录下的文件情况【Enter 下一行】
-
重置root和abong的密码
-
发送邮件给abong用户,将正文和标题打包并发送【邮件=对象+标题+正文】
-
发送邮件给abong,输入正文,直到输入over才发送邮件
# tee命令
# 格式:输出命令 | tee [-a] 文件名
# 将标准输出的内容写入到文件中,不写入错误输出,若文件不存在,则创建文件。
# 即文件内容要么是标准输出,要么为空。
[root@master ~]# free -h | tee a.txt
total used free shared buff/cache available
Mem: 1.8G 727M 361M 37M 730M 813M
Swap: 2.0G 0B 2.0G
[root@master ~]# cat a.txt
total used free shared buff/cache available
Mem: 1.8G 727M 361M 37M 730M 813M
Swap: 2.0G 0B 2.0G
[root@master ~]# df -h | tee -a a.txt
文件系统 容量 已用 可用 已用% 挂载点
/dev/mapper/centos-root 47G 3.9G 44G 9% /
devtmpfs 894M 0 894M 0% /dev
tmpfs 910M 0 910M 0% /dev/shm
tmpfs 910M 11M 900M 2% /run
tmpfs 910M 0 910M 0% /sys/fs/cgroup
/dev/sda1 1014M 179M 836M 18% /boot
tmpfs 182M 8.0K 182M 1% /run/user/42
tmpfs 182M 24K 182M 1% /run/user/0
/dev/sr0 4.3G 4.3G 0 100% /run/media/root/CentOS 7 x86_64
[root@master ~]# cat a.txt
total used free shared buff/cache available
Mem: 1.8G 727M 361M 37M 730M 813M
Swap: 2.0G 0B 2.0G
文件系统 容量 已用 可用 已用% 挂载点
/dev/mapper/centos-root 47G 3.9G 44G 9% /
devtmpfs 894M 0 894M 0% /dev
tmpfs 910M 0 910M 0% /dev/shm
tmpfs 910M 11M 900M 2% /run
tmpfs 910M 0 910M 0% /sys/fs/cgroup
/dev/sda1 1014M 179M 836M 18% /boot
tmpfs 182M 8.0K 182M 1% /run/user/42
tmpfs 182M 24K 182M 1% /run/user/0
/dev/sr0 4.3G 4.3G 0 100% /run/media/root/CentOS 7 x86_64
3. 通配符
通配符,常用于查找文件,进行模糊查询。常见的通配符:
通配符 | 作用 |
---|---|
* | 匹配0个或者多个字符 |
? | 匹配单个字符 |
[0-9] | 匹配0~9之间的单个数字的字符 |
[a-z] | 匹配a~z之间的单个字母的字符 |
[A-Z] | 匹配A~Z之间的单个字母的字符 |
[abc] | 匹配a、b、c三个字符中的任意一个字符 |
4. 转义字符
在Linux中,提供了转义字符来处理特殊的输入数据。
常用的转义字符如下:
转义字符 | 作用 |
---|---|
\ | 【转义单个字符】反斜杠后面的变量变为单纯的字符,如\$![]() |
‘’ | 【转义字符串】单引号,其中的变量变为单纯的字符串,如’\$$num’![]() |
“” | 【不转义字符串】双引号,保留其中的变量属性,不进行转义![]() |
`` | 反引号,返回反引号中命令的结果`wc -l readme.txt`![]() |
5. 环境变量
1、在Linux中,变量是计算机系统用于保存可变值的数据类型。一般都是大写的。使用变量时要加$。而环境变量,是用来定义系统运行环境的一些参数。
2、可通过env
命令查询系统的环境变量。也可以和我这样通过命令env | cut -d= -f1 | more
翻页查看环境变量名。
3、PATH环境变量介绍
可通过以下两种方式查看PATH变量的值
可以看到,PATH的值是5个目录。
PATH的作用:告诉Bash解释器(Shell解释器的一种)待执行的命令可能存放在哪个目录,然后Bash解释器就会逐个目录查找该命令,找到了,就执行该命令。
可以修改PATH的值,如添加目录
4、命令的执行步骤
- 判断命令是否以绝对路径或者相对路径执行,是的话,直接执行。
- 若不是,则检查命令是否是“别名命令”,是的话,也直接执行。
定义别名 :alias 别名=命令
取消别名:unalias 别名
- 若不是,则检查命令是内部命令还是外部命令【
whereis 命令
】。若是内部命令则直接执行。
- 若是外部命令,则在PATH环境变量所对应的目录中查找相应的命令名,找到再执行。否则不执行该命令。
注意:若PATH环境变量所对应的目录有根目录,则若是在根目录中存在与某些命令同名的木马文件,则在执行命令的时候即执行了这些木马文件,故不建议将根目录添加到PATH环境变量中。
5、自定义变量
用户可以自定义变量,通常用大写字母定义。自定义的变量可以是局部的,也可以是全局的。
局部变量:创建的用户可以使用,其他用户不能使用。
全局变量:所有用户都能使用。【可通过export 变量名
将局部变量提升为全局变量】【可能由于权限不足导致普通用户无法使用】
用户可以通过变量名 = 变量值
定义变量。
在学习完本节内容后,结合linux常用命令,已经能够理解并写出较为复杂的命令了,加油,熊博主!!!