《LinuxProbe》—RHCE 学习 Day7

Posted myxxw2010

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《LinuxProbe》—RHCE 学习 Day7相关的知识,希望对你有一定的参考价值。

第三章 管道符、重定向与环境变量

一、输入输出重定向

1)知识点简述

《LinuxProbe》—RHCE

2)知识点详述

《LinuxProbe》—RHCE

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 Apr 9 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 Apr 9 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
root 979 0.0 0.1 17172 2384 ? S 01:19 0:00 /bin/bash /usr/sbin/ksmtuned
root 2848 0.0 0.2 26668 5540 pts/0 Ss 01:25 0:00 bash
root 4095 0.0 0.2 26644 5280 pts/1 Ss+ 02:07 0:00 bash
root 4625 0.0 0.2 26540 5440 pts/2 Ss+ 02:31 0:00 bash
root 4787 0.0 0.0 12112 1096 pts/0 S+ 02:37 0: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、常用的转义字符

反斜杠(\\)

使反斜杠后的一个变量变为单纯的字符。

单引号( )

转义其中所有为单纯的字符串。

双引号(" ")

有空格则加上,做为一个整体。

反引号(` `)

执行里面的命令,取返回结果。

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
total used free shared buff/cache available
Mem: 1966 1223 282 17 459 564
Swap: 2047 13 2034
[root@localhost etc]# free -m | grep Mem:
Mem: 1966 1224 282 17 459 563
[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  (网卡重启命令)

《LinuxProbe》—RHCE

以上是关于《LinuxProbe》—RHCE 学习 Day7的主要内容,如果未能解决你的问题,请参考以下文章

《LinuxProbe》—RHCE 学习 Day 3

《LinuxProbe》—RHCE 学习 Day4

《LinuxProbe》—RHCE 学习 Day5

《LinuxProbe》—RHCE 学习 Day6-8

《LinuxProbe》—RHCE 学习 Day6-8

《LinuxProbe》—RHCE 学习 Day6-8