目录
前言
1. 输入输出重定向
2. 管道命令符
3. 命令行的通配符
4. 常用的转义字符
5. 重要的环境变量
悟已往之不谏,知来者之可追。实迷途其未远,觉今是而昨非。舟遥遥以轻飏,风飘飘而吹衣。问征夫以前路,恨晨光之熹微。
第一版我已经全部放到我的精选里了,大家可以点开我的头像主页,选择精选观看,本系列依照《Linux就该这么学》第二版随书学习练习操作,将一些课本上不顺畅的地方,全部以最简方式免费开源展示给大家,资源大家可以自行百度,学习起来我们既要多巴胺也要内啡肽。
这两天异常的疲惫,但是也是鼓起勇气继续更新,天冷加衣,希望大家注意身体。为什么要写运维的东西呢,因为是云计算云服务器的基础,感觉是在给自己和大家提醒,不要觉得事情本来就如同你看到的那么简单,有的时候还是要看一下原理。延伸一下在校的也要提前展望一下将来——思危,在职的还是要学一些东西的——思退,失业的也可以补充一下自己——思变,以后都要进入职场的大熔炉里,在其位谋其政,同时思危、思退、思变。同样一首天王的歌送给大家<周杰伦-以父之名>,希望大家继续努力搬砖学习!
输入重定向是指把文件导入到命令中,而输出重定向则是指把原本要输出到屏幕的数据信息写入到指定文件中。
标准输入重定向(STDIN,文件描述符为0):默认从键盘输入,也可从其他文件或命令中输入。
标准输出重定向(STDOUT,文件描述符为1):默认输出到屏幕。
错误输出重定向(STDERR,文件描述符为2):默认输出到屏幕。
[root@bogon ~]# ll test2
-rw-r--r--. 1 root root 48 Nov 8 15:25 test2
[root@bogon ~]# ll test3
ls: cannot access 'test3': No such file or directory
输入重定向中符号及作用
符号 | 作用 |
命令 < 文件 | 将文件作为命令的标准输入 |
命令 << 分界符 | 从标准输入中读入,直到遇见分界符才停止 |
命令 < 文件1 > 文件2 | 将文件1作为命令的标准输入并将标准输出到文件2 |
输入重定向中符号及作用
符号 | 作用 |
命令 > 文件 | 将标准输出重定向到一个文件中(清空原有文件的数据) |
命令 2> 文件 | 将错误输出重定向到一个文件中(清空原有文件的数据) |
命令 >> 文件 | 将标准输出重定向到一个文件中(追加到原有内容的后面) |
命令 2>> 文件 | 将错误输出重定向到一个文件中(追加到原有内容的后面) |
命令 >> 文件 2>&1或命令 &>> 文件 | 将标准输出与错误输出共同写入到文件中(追加到原有内容的后面) |
重定向中的标准输出模式,可以省略文件描述符1不写,而错误输出模式的文件描述符2是必须要写,通过标准输出重定向将man bash命令原本要输出到屏幕的信息写入到文件bash.txt中,然后显示bash.txt文件中的内容:
[root@bogon ~]# man bash > bash.txt
[root@bogon ~]# head -n 3 bash.txt
BASH(1) General Commands Manual BASH(1)
NAME
[root@bogon ~]#
覆盖写入模式向文件中写入数据时,每一次都会覆盖掉上一次写入的内容,所以最终文件中只有最后一次的写入结果:
[root@bogon ~]# echo "i like linux" > bash.txt
[root@bogon ~]# head -n 1 bash.txt
i like linux
[root@bogon ~]#
通过追加写入模式向bash.txt文件写入一次数据:
[root@bogon ~]# head -n 2 bash.txt
i like linux
i love linux
[root@bogon ~]#
标准输出将原本要输出到屏幕的信息写入到文件中:
[root@bogon ~]# ll bash.txt 2> test2
-rw-r--r--. 1 root root 26 Nov 10 15:34 bash.txt
不区分标准输出和错误输出,只要命令有输出信息则全部追加写入到文件中:
[root@bogon ~]# ll bash.txt &>> test2
[root@bogon ~]# ll bash1.txt &>> test2
[root@bogon ~]# cat test2
-rw-r--r--. 1 root root 26 Nov 10 15:34 bash.txt
ls: cannot access 'bash1.txt': No such file or directory
使用输入重定向把bash.txt文件导入给wc -l命令,统计一下文件中的内容行数(只读取信息流数据):
[root@bogon ~]# wc -l < bash.txt
2
执行格式为“命令A | 命令B”。管道命令符的作用也可以用一句话概括为“把前一个命令原本要输出到屏幕的信息当作后一个命令的标准输入”
找出被限制登录用户的命令是grep /sbin/nologin /etc/passwd和统计文本行数的命令则是wc -l,将两条命令通过管道合并:
[root@bogon ~]# grep /sbin/nologin /etc/passwd | wc -l
42
用翻页的形式查看/etc目录中的文件列表及属性信息:
[root@bogon ~]# ll /etc/ | more
drwxr-xr-x. 2 root root 34 Nov 6 11:30 cupshelpers
drwxr-xr-x. 4 root root 78 Nov 6 11:27 dbus-1
drwxr-xr-x. 4 root root 31 Nov 6 11:28 dconf
drwxr-xr-x. 2 root root 33 Nov 6 11:36 default
drwxr-xr-x. 2 root root 40 Nov 6 11:29 depmod.d
--More--
用一条命令来完成密码重置操作:
[root@bogon ~]# echo "123" | passwd --stdin root
Changing password for user root.
passwd: all authentication tokens updated successfully.
ps、grep、管道符三者结合到一起使用了。下面搜索与bash有关的进程信息:
[root@bogon ~]# ps aux | grep bash
root 1051 0.0 0.1 26244 2324 ? S 15:02 0:00 /bin/bash /usr/sbin/ksmtuned
root 2346 0.0 0.3 27688 5708 pts/0 Ss 15:03 0:00 -bash
root 2964 0.0 0.0 12136 1148 pts/0 S+ 15:58 0:00 grep --color=auto bash
显示系统中所有与bash相关的进程信息,并同时将输出到屏幕和文件中:
[root@bogon ~]# ps aux | grep bash | tee result.txt
root 1051 0.0 0.1 26244 2324 ? S 15:02 0:00 /bin/bash /usr/sbin/ksmtuned
root 2346 0.0 0.3 27688 5708 pts/0 Ss 15:03 0:00 -bash
root 3056 0.0 0.0 12136 1036 pts/0 S+ 16:05 0:00 grep --color=auto bash
[root@bogon ~]# cat result.txt
root 1051 0.0 0.1 26244 2324 ? S 15:02 0:00 /bin/bash /usr/sbin/ksmtuned
root 2346 0.0 0.3 27688 5708 pts/0 Ss 15:03 0:00 -bash
root 3056 0.0 0.0 12136 1036 pts/0 S+ 16:05 0:00 grep --color=auto bash
通配符就是通用的匹配信息的符号,比如星号(*)代表匹配零个或多个字符,问号(?)代表匹配单个字符,中括号内加上数字[0-9]代表匹配0~9之间的单个数字的字符,而中括号内加上字母[abc]则是代表匹配a、b、c三个字符中的任意一个字符。
Linux系统中通配符及含义
通配符 | 含义 |
* | 任意字符 |
? | 单个任意字符 |
[a-z] | 单个小写字母 |
[A-Z] | 单个大写字母 |
[a-Z] | 单个字母 |
[0-9] | 单个数字 |
[[:alpha:]] | 任意字母 |
[[:upper:]] | 任意大写字母 |
[[:lower:]] | 任意小写字母 |
[[:digit:]] | 所有数字 |
[[:alnum:]] | 任意字母加数字 |
[[:punct:]] | 标点符号 |
匹配所有在/dev目录中且以nvm开头的文件:
[root@bogon ~]# ll /dev/nvm*
crw-------. 1 root root 244, 0 Nov 10 15:02 /dev/nvme0
brw-rw----. 1 root disk 259, 0 Nov 10 15:02 /dev/nvme0n1
brw-rw----. 1 root disk 259, 1 Nov 10 15:02 /dev/nvme0n1p1
brw-rw----. 1 root disk 259, 2 Nov 10 15:02 /dev/nvme0n1p2
brw-rw----. 1 root disk 259, 3 Nov 10 15:02 /dev/nvme0n1p3
只想查看文件名以nvme0n1p开头,但是后面还紧跟其他某一个字符的文件的相关信息:
[root@bogon ~]# ll /dev/nvme0n1p?
brw-rw----. 1 root disk 259, 1 Nov 10 15:02 /dev/nvme0n1p1
brw-rw----. 1 root disk 259, 2 Nov 10 15:02 /dev/nvme0n1p2
brw-rw----. 1 root disk 259, 3 Nov 10 15:02 /dev/nvme0n1p3
批量创建文件:
[root@bogon ~]# touch {AA,BB,CC}.conf
[root@bogon ~]# ll *.conf
-rw-r--r--. 1 root root 0 Nov 10 16:17 AA.conf
-rw-r--r--. 1 root root 0 Nov 10 16:17 BB.conf
-rw-r--r--. 1 root root 0 Nov 10 16:17 CC.conf
4个最常用的转义字符
反斜杠(\):使反斜杠后面的一个变量变为单纯的字符。
单引号(' '):转义其中所有的变量为单纯的字符串。
双引号(" "):保留其中的变量属性,不进行转义处理。
反引号(` `):把其中的命令执行后返回结果。
定义一个名为PRICE的变量并赋值为5,然后输出以双引号括起来的字符串与变量信息:
[root@bogon ~]# PRICE=5
[root@bogon ~]# echo "price is $PRICE"
price is 5
特殊符号提取转义成单纯文本:
[root@bogon ~]# echo "Price is \$$PRICE"
Price is $5
反引号与uname -a命令结合,使用echo命令来查看本机的Linux版本和内核信息:
[root@bogon ~]# echo `uname -a`
Linux bogon 4.18.0-348.el8.x86_64 #1 SMP Tue Oct 19 15:14:17 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
变量是计算机系统用于保存可变值的数据类型。在Linux系统中,变量名称一般都是大写的,命令则都是小写的,命令在Linux中的执行分为4个步骤。
第1步:判断用户是否以绝对路径或相对路径的方式输入命令(如/bin/ls),如果是绝对路径则直接执行,否则进入第2步继续判断。
第2步:Linux系统检查用户输入的命令是否为“别名命令”,即用一个自定义的命令名称来替换原本的命令名称。
用alias命令来创建一个属于自己的命令别名,语法格式为“alias别名=命令”
若要取消一个命令别名,则是用unalias命令,语法格式为“unalias别名”
第3步:Bash解释器判断用户输入的是内部命令还是外部命令。内部命令是解释器内部的指令,会被直接执行;而用户在绝大部分时间输入的是外部命令,这些命令交由步骤4继续处理。
可以使用“type命令名称”来判断用户输入的命令是内部命令还是外部命令:
[root@bogon ~]# type echo
echo is a shell builtin
[root@bogon ~]# type uptime
uptime is /usr/bin/uptime
第4步:系统在多个路径中查找用户输入的命令文件,而定义这些路径的变量叫作PATH,可以简单地把它理解成是“解释器的小助手”,作用是告诉Bash解释器待执行的命令可能存放的位置,然后Bash解释器就会乖乖地在这些位置中逐个查找。PATH是由多个路径值组成的变量,每个路径值之间用冒号间隔,对这些路径的增加和删除操作将影响到Bash解释器对Linux命令的查找。
[root@bogon ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@bogon ~]# PATH=$PATH:/root/bin
[root@bogon ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/root/bin
作为一名态度谨慎、有经验的运维人员,在接手一台Linux系统后一定会在执行命令前先检查PATH变量中是否有可疑的目录。
最重要的10个环境变量
变量名称 | 作用 |
HOME | 用户的主目录(即家目录) |
SHELL | 用户在使用的Shell解释器名称 |
HISTSIZE | 输出的历史命令记录条数 |
HISTFILESIZE | 保存的历史命令记录条数 |
邮件保存路径 | |
LANG | 系统语言、语系名称 |
RANDOM | 生成一个随机数字 |
PS1 | Bash解释器的提示符 |
PATH | 定义解释器搜索用户执行命令的路径 |
EDITOR | 用户默认的文本编辑器 |
查看HOME变量在不同的用户身份下都有哪些值:
[root@bogon ~]# echo $HOME
/root
[root@bogon ~]# su - centos8
Last login: Tue Nov 7 08:58:40 CST 2023 on pts/0
[centos8@bogon ~]$ echo $HOME
/home/centos8
设置一个名称为WORKDIR的变量,方便用户更轻松地进入一个层次较深的目录:
root@bogon ~]# mkdir /home/workdir
[root@bogon ~]# WORKDIR=/home/workdir
[root@bogon ~]# cd $WORKDIR
[root@bogon workdir]# pwd
/home/workdir
变量不具有全局性,作用范围也有限,默认情况下不能被其他用户使用:
[root@bogon workdir]# su centos8
[centos8@bogon workdir]$ cd $WORKDIR
[centos8@bogon ~]$ echo $WORKDIR
[centos8@bogon ~]$ exit
使用export命令将其提升为全局变量:
[root@bogon workdir]# export WORKDIR
[root@bogon workdir]# su centos8
[centos8@bogon workdir]$ cd $WORKDIR
[centos8@bogon workdir]$ pwd
/home/workdir
不使用这个变量了,则可执行unset命令把它取消掉:
[root@bogon workdir]# unset WORKDIR
[root@bogon workdir]#
直接在终端设置的变量能够立即生效,但在重启服务器后就会失效,因此我们需要将变量和变量值写入到.bashrc或者.bash_profile文件中,以确保永久能使用它们。