《LinuxProbe》—RHCE 学习 Day7

智慧并不产生于学历,而是来自对于知识的终生不懈的追求。这篇文章主要讲述《LinuxProbe》—RHCE 学习 Day7相关的知识,希望能为你提供帮助。
第三章 管道符、重定向与环境变量
一、输入输出重定向1)知识点简述
2)知识点详述
3)输入重定向中用到的符号及其作用

符号
作用
命令 < 文件
将文件作为命令的标准输入
命令 < < 分界符
从标准输入中读入,直到遇见分界符才停止
命令 < 文件1 > 文件2
将文件1作为命令的标准输入并将标准输出到文件2
4)输出重定向中用到的符号及其作用
符号
作用
命令 > 文件
将标准输出重定向到一个文件中(清空原有文件的数据)
命令 2> 文件
将错误输出重定向到一个文件中(清空原有文件的数据)
命令 > > 文件
将标准输出重定向到一个文件中(追加到原有内容的后面)
命令 2> > 文件
将错误输出重定向到一个文件中(追加到原有内容的后面)
命令 > > 文件 2> & 1

命令 & > > 文件
将标准输出与错误输出共同写入
5)示例:
  • 标准输出重定向——覆盖写入
[root@linuxprobe ~]# echo "Welcome to LinuxProbe.Com" > readme.txt
[root@linuxprobe ~]# echo "Welcome to LinuxProbe.Com" > readme.txt
[root@linuxprobe ~]# echo "Welcome to LinuxProbe.Com" > readme.txt
[root@linuxprobe ~]# echo "Welcome to LinuxProbe.Com" > readme.txt
[root@linuxprobe ~]# echo "Welcome to LinuxProbe.Com" > readme.txt
[root@linuxprobe ~]# cat readme.txt
Welcome to LinuxProbe.Com

  • 标准输出重定向——追加写入
[root@linuxprobe ~]# echo "Quality linux learning materials" > > readme.txt
[root@linuxprobe ~]# cat readme.txt
Welcome to LinuxProbe.Com
Quality linux learning materials

  • 错误输出重定向
[root@linuxprobe ~]# ls -l xxxxxx > /root/stderr.txt
cannot access xxxxxx: No such file or directory
[root@linuxprobe ~]# ls -l xxxxxx 2> /root/stderr.txt
[root@linuxprobe ~]# cat /root/stderr.txt
ls: cannot access xxxxxx: No such file or directory

  • 混合(全部)输出重定向(追加模式)
[root@localhost ~]# ls -l linuxprobe
ls: cannot access linuxprobe: No such file or directory
[root@localhost ~]# ls anaconda-ks.cfg
anaconda-ks.cfg
[root@localhost ~]# ls -l anaconda-ks.cfg & > > readme.txt
[root@localhost ~]# ls -l linuxprobe & > > readme.txt
[root@localhost ~]# cat readme.txt
-rw-------. 1 root root 1395 Apr9 23:07 anaconda-ks.cfg
ls: cannot access linuxprobe: No such file or directory
[root@localhost ~]#

  • 混合(全部)输出重定向(覆盖模式)
[root@localhost ~]# ls -l linux.probe
ls: cannot access linux.probe: No such file or directory
[root@localhost ~]# ls -l anaconda-ks.cfg
-rw-------. 1 root root 1395 Apr9 23:07 anaconda-ks.cfg
[root@localhost ~]# ls -l anaconda-ks.cfg & > readme.txt
[root@localhost ~]# ls -l linux.probe & > readme.txt
[root@localhost ~]# cat readme.txt
ls: cannot access linux.probe: No such file or directory
[root@localhost ~]#

  • 标准输入重定向
命令 < 文件
[root@localhost ~]# wc -l < readme.txt
1
[root@localhost ~]# wc -l readme.txt
1 readme.txt
[root@localhost ~]#

命令 < 文件1 > (或> > ) 文件2
[root@localhost ~]# cat readme.txt
ls: cannot access linux.probe: No such file or directory
abcdef
[root@localhost ~]# cat < readme.txt > linxu.probe
[root@localhost ~]# cat < readme.txt > linxu.probe
[root@localhost ~]# cat linxu.probe
ls: cannot access linux.probe: No such file or directory
abcdef
[root@localhost ~]# cat < readme.txt > > linxu.probe
[root@localhost ~]# cat < readme.txt > > linxu.probe
[root@localhost ~]# cat linxu.probe
ls: cannot access linux.probe: No such file or directory
abcdef
ls: cannot access linux.probe: No such file or directory
abcdef
ls: cannot access linux.probe: No such file or directory
abcdef
[root@localhost ~]#

命令 < < 分界符      (注:分界符是EOF)
[root@localhost ~]# cat < < EOF
> a
> b
> c
> d
> EOF
a
b
c
d
[root@localhost ~]#

命令 > > 文件 < < EOF
[root@localhost ~]#
[root@localhost ~]# cat > > Cyril < < EOF
> readme.txt
> xiaogua
> abcdefghijk
> Linuxprobe.com
> eof
> EOF
[root@localhost ~]# cat Cyril
readme.txt
xiaogua
abcdefghijk
Linuxprobe.com
eof
[root@localhost ~]#

二、管道命令符 (|)1、格式:命令A | 命令B| 命令C把前一个命令原本要输出到屏幕的信息作为后1个命令的标准输入。
2、应用示例:1)统计有多少个用户可以登录到服务器?提示:/etc/passwd 文件中记录了所有的用户信息,其中最后1列决定了用户能否登录到服务器。
root:x:0:0:root:/root:/bin/bash
/bin/bash       可正常登录服务器
/sbin/nologin   不能登录,只能以该用户身份使用某些服务
[root@localhost ~]# grep /sbin/nologin /etc/passwd | wc -l
40
[root@localhost ~]# grep /bin/bash /etc/passwd
root:x:0:0:root:/root:/bin/bash
linuxprobe:x:1000:1000:linuxprobe:/home/linuxprobe:/bin/bash
[root@localhost ~]# grep /bin/bash /etc/passwd | wc -l
2
[root@localhost ~]#

2)统计目录下有多少个文件ls -l 和 ls 统计的结果不一样是因为ls -l 可以看到. (汇总文件)
ls 命令执行后显示的列数与窗口大小有关,但不影响数量的统计
[root@localhost etc]# ls > xiaomi
[root@localhost etc]# wc -l xiaomi
260 xiaomi
[root@localhost etc]# ls | wc -l
260
[root@localhost etc]# ls -l | wc -l
261
[root@localhost etc]#

3)为用户设定密码直接设定密码是必须配合管道符(|)使用--stdin参数
注:man passwd
  --stdin   
This option is used to indicate that passwd should read the new password from standard input, which can be a pipe.
[root@localhost etc]# echo redhat | passwd linuxprobe
Changing password for user linuxprobe.
New password: BAD PASSWORD: The password is shorter than 8 characters
Retype new password: Password change aborted.
passwd: Authentication token manipulation error
[root@localhost etc]# echo redhat | passwd --stdin linuxprobe
Changing password for user linuxprobe.
passwd: all authentication tokens updated successfully.
[root@localhost etc]#

4)从命令执行后显示的众多信息中过滤需要内容(px aux | grep bash)
[root@localhost etc]# ps aux | wc -l
324
[root@localhost etc]# ps aux | grep bash
root9790.00.1171722384 ?S01:190:00 /bin/bash /usr/sbin/ksmtuned
root28480.00.2266685540 pts/0Ss01:250:00 bash
root40950.00.2266445280 pts/1Ss+02:070:00 bash
root46250.00.2265405440 pts/2Ss+02:310:00 bash
root47870.00.0121121096 pts/0S+02:370:00 grep --color=auto bash
[root@localhost etc]#

三、命令行通配符1、Linux系统中的通配符及含义
通配符
含义
*
任意字符(空值、无穷多个)
?
单个任意字符
[a-z]
单个小写字母
[A-Z]
单个大写字母
[a-Z]
单个字母
[0-9]
单个数字
[a,b,c,d,e]
a,b,c,d,e中的某个字母
[1,3,5]
1,3,5是的某个数字
[[:alpha:]]
任意字母
[[:upper:]]
任意大写字母
[[:lower:]]
任意小写字母
[[:digit:]]
所有数字
[[:alnum:]]
任意字母加数字
[[:punct:]]
标点符号
2、应用示例1)查看所有硬盘的相关权限属性
[root@linuxprobe ~]# ls -l /dev/sda*
brw-rw----. 1 root disk 8, 0 May 4 15:55 /dev/sda
brw-rw----. 1 root disk 8, 1 May 4 15:55 /dev/sda1
brw-rw----. 1 root disk 8, 2 May 4 15:55 /dev/sda2

[root@linuxprobe ~]# ls -l /dev/sda?
brw-rw----. 1 root disk 8, 1 May 4 15:55 /dev/sda1
brw-rw----. 1 root disk 8, 2 May 4 15:55 /dev/sda2

[root@linuxprobe ~]# ls -l /dev/sda[0-9]
brw-rw----. 1 root disk 8, 1 May 4 15:55 /dev/sda1
brw-rw----. 1 root disk 8, 2 May 4 15:55 /dev/sda2
[root@linuxprobe ~]# ls -l /dev/sda[135]
brw-rw----. 1 root disk 8, 1 May 4 15:55 /dev/sda1

2)搜索/etc/目录中所有以.conf结尾的配置文件
[root@linuxprobe ~]# ls -l /etc/*.conf
-rw-r--r--. 1 root root 55 Feb 1 2019 /etc/asound.conf
-rw-r--r--. 1 root root 25696 Dec 12 2018 /etc/brltty.conf

4)批量创建多个文件(需要使用大括号,并且字段之间用逗号间隔)
[root@linuxprobe ~]# touch AA,BB,CC.conf
[root@linuxprobe ~]# ls -l *.conf
-rw-r--r--. 1 root root 0 Sep 22 01:54 AA.conf
-rw-r--r--. 1 root root 0 Sep 22 01:54 BB.conf
-rw-r--r--. 1 root root 0 Sep 22 01:54 CC.conf

5)批量输出指定信息
[root@linuxprobe ~]# echo file1,2,3,4,5
file1 file2 file3 file4 file5

四、常用转义字符1、约定:命令:小写
变量:大写   (标准约定俗成)
$$: 显示当前命令的PID值     (确认一下)
$用于定义变量
2、常用的转义字符
反斜杠(\\)
使反斜杠后的一个变量变为单纯的字符。
单引号( )
转义其中所有为单纯的字符串。
双引号(" ")
【《LinuxProbe》—RHCE 学习 Day7】有空格则加上,做为一个整体。
反引号(` `)
执行里面的命令,取返回结果。
3、应用示例1)转义字符 (\\)
[root@linuxprobe ~]# PRICE=5
[root@linuxprobe ~]# echo "Price is $PRICE"
Price is 5
[root@linuxprobe ~]# echo "Price is $$PRICE"
Price is 3767PRICE
[root@linuxprobe ~]# echo "Price is \\$$PRICE"
Price is $5

2)转义字符( ``)
[root@linuxprobe ~]# echo `uname -a`
Linux linuxprobe.com 4.18.0-80.el8.x86_64 #1 SMP Wed Mar 13 12:02:46 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux

3)转义字符("")
[root@linuxprobe ~]# echo AA BB CC
AA BB CC
[root@linuxprobe ~]# echo "AA BB CC"
AA BB CC

解释:
echo AA BB CC 在执行时,可能把“AA BB CC”当作一个参数整体直接输出到屏幕,也有可能分别将AA、BB和CC输出到屏幕。
4)统计当前空闲内存值
[root@localhost etc]# free -m
totalusedfreesharedbuff/cacheavailable
Mem:1966122328217459564
Swap:2047132034
[root@localhost etc]# free -m | grep Mem:
Mem:1966122428217459563
[root@localhost etc]# free -m | grep Mem: | awk print $4
281
[root@localhost etc]# HAHA=`free -m | grep Mem: | awk print $4`
[root@localhost etc]# echo $HAHA
281
[root@localhost etc]# HOHO=$(free -m | grep Mem: | awk print $4)
[root@localhost etc]# echo $HOHO
281

五、重要环境变量1、约定俗成在Linux系统中,变量名称一般都是大写的,命令则都是小写的,这是一种约定俗成的规范。
2、Linux命令的执行过程
步骤
解释
第1步
/路径/命令 (命令路径及文件,如:/bin/ls)
第2步
别名命令 (Alias)
第3步
内部命令(built-in)
第4步
外部命令(超过99.99%的命令都是外部命令,保存在服务某个文件中,如何保证外部命令可以快速执行靠的是$PATH变量
1)命令别名创建别名:alias别名=命令
取消别名:unalias别名
[root@linuxprobe ~]# unalias rm
[root@linuxprobe ~]# rm initial-setup-ks.cfg

2)查看命令类型(内部、外部)
[root@linuxprobe ~]# type echo
echo is a shell builtin
[root@linuxprobe ~]# type uptime
uptime is /usr/bin/uptime

3)关于$PATH变量(存放外部命令所在位置)PATH,可理解成“解释器的小助手”,作用是告诉Bash解释器待执行的命令可能存放的位置,然后Bash解释器就会这些位置中逐个查找。PATH是由多个路径值组成的变量,路径值之间用冒号间隔,对这些路径的增加和删除操作将影响到Bash解释器对Linux命令的查找。
[root@linuxprobe ~]# echo $PATH
/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/root/bin
[root@linuxprobe ~]# PATH=$PATH:/root/bin
[root@linuxprobe ~]# echo $PATH
/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/root/bin:/root/bin

4)为什么不能添加当前目录(.)到PATH中呢?,尽管可以将当前目录(.)添加到PATH变量中,从而在某些情况下可以让用户免去输入命令所在路径的麻烦。但是,如果hei客在比较常用的公共目录/tmp中存放了一个与ls或cd命令同名的muma文件,而用户又恰巧在公共目录中执行了这些命令,那么就极有可能中招了。
3、最重要的10个环境变量
变量名称
作用
HOME
用户的主目录(即家目录)
SHELL
用户在使用的Shell解释器名称
HISTSIZE
输出的历史命令记录条数
HISTFILESIZE
保存的历史命令记录条数
MAIL
邮件保存路径
LANG
系统语言、语系名称
RANDOM
生成一个随机数字
PS1
Bash解释器的提示符
PATH
定义解释器搜索用户执行命令的路径
EDITOR
用户默认的文本编辑器
1)HOME变量
[root@linuxprobe ~]# echo $HOME
/root
[root@linuxprobe ~]# su - linuxprobe
[linuxprobe@linuxprobe ~]$ echo $HOME
/home/linuxprobe

2)变量的方便之处
[root@linuxprobe ~]# mkdir /home/workdir
[root@linuxprobe ~]# WORKDIR=/home/workdir
[root@linuxprobe ~]# cd $WORKDIR
[root@linuxprobe workdir]# pwd
/home/workdir

3)使用export 命令设置全局变量
[root@linuxprobe ~]# export WORKDIR
[root@linuxprobe ~]# su linuxprobe
[linuxprobe@linuxprobe ~]$ cd $WORKDIR
[linuxprobe@linuxprobe workdir]$ pwd
/home/workdir

4)取消全局变量
[root@linuxprobe ~]# unset WORKDIR
[root@linuxprobe ~]#

4、注意事项1)修改环境变量配置文件后,可使用source   配置文件路径 强制生效2)nmcli connection up ens160   (网卡重启命令)

    推荐阅读