目录
一、Linux基础特性
1、Tab 命令补全
总的来说:输入正确且唯一的字符按下Tab键会自动补全,正确但是不唯一会给出一个列表可供选择,若输入的部分字母在系统中没有任何以它开头的命令,则无论按多少次Tab键都没有任何反应。例如:
*+Tab+Tab 列出当前路径下的子目录但不包含隐藏目录
~+Tab+Tab 列出当前系统中的所有用户
2、快捷键的使用
-在控制台下:
复制命令:Ctrl + Insert 组合键或用鼠标选中即是复制。
粘贴命令:Shift + Insert 组合键或单击鼠标滚轮即为粘贴。
Ctrl+Y 将删除的内容粘贴回来
键盘中的上下箭头 可以逐一调用使用过历史命令
Ctrl+Z 挂起 在文件编辑状态下不想退出编辑状态又想执行其他命令时可以使用;按输入fg在按回车退回到编辑状态
(Ctrl+S 锁屏;Ctrl+Q 解除锁屏,在Centos里可以,MobaXterm好像不可以)
按 Ctrl的同时按左右键可以一个单词一个单词的移动,提升效率
3、命令行历史
在命令提示符下使用过的命令的历史记录,使用过的命令会被存放于内存之中,当再次使用时可以从内存中再次调用,不需要再次输入;
命令行历史被写在.bash_history中,它是个隐藏文件,想要查看可使用less -NM .bash_history,退出按Q;
并且它不是实时更新的,只有在退出登录时才会将新写入的命令更新在.bash_history中;
如果想让它实时更新可以输入history -a,
常用参数
history 5 显示当前历史命令最后5行
history -d 5 清除命令号为5的记录
history -c 清除内存中所有的命令,但是并没有清除历史命令文件中的命令;
history -a 和history -w基本没什么区别作用都是实时更新.bash_history文件;
history -r 是把命令历史文件中的内容读取当前history记忆中
history -s "" 伪造历史
键盘中的上下键可以调用之前使用过的命令,!+数字可以调用指定行数的命令,!!调用并执行上一条命令;(基本不用)
history默认显示所有的命令,HESTSIZE=10表示只显示10条命令
tips:tail 加文件名查看的是文件的后十行,查看命令的后十行 history 10
HISTSIZE命令定义history命令输出的记录数,如果HISTSIZE=20,表示显示20条命令,如果在这种情况下设置HISTSIZE=25表示从现在起只显示25条命令;
HISTCONTROL
HISTCONTROL, 用于控制如何在历史记录列表中保存命令。 HISTCONTROL变量使我们可以更有效地存储bash历史记录。它可用于忽略重复的命令或带前导空格的命令, 或两者都忽略。
HISTCONTROL=ignoredups
执行此命令后的历史记录将不会存储与最近使用的命令相同的命令。相当于如果连续执行多个pwd命令,执行history -a命令后将只会存储一个pwd命令,但若是相同的命令之间不是连续的那么也会存储进去,举例:
执行以下命令:(相同的命令之间不是连续的)
如图所示相同命令之间不是连续的也会存储进去的
(操作时发现即使不使用该命令连续使用相同的命令也只会存储一个)
HISTCONTROL=ignorespace
ignorespace:以空格字符开头的行不包含在历史记录列表中。一般情况下包含空格的命令也会存储进去;如果我们不希望命令包含在历史记录中, 则可以在命令之前使用空格字符, 以避免将其包含在历史记录列表中。举例。
执行以下几个命令:
如下图所示只存储了不以空格开头的命令:
HISTCONTROL=ignoreboth
ignoreboth:历史记录将不包括带有前导空格字符和重复项的命令。
执行如下命令
如下图所示,使用了该命令后,
4、命令别名
暂时别名
例如:
[root@localhost ~]# alias violet='cd /root/Test'
[root@localhost ~]# violet取消暂时命名
[root@localhost Test]# unalias violet
[root@localhost Test]# violet
-bash: violet: command not found这种命令别名是暂时的,退出登录后就不生效了;
永久别名
命令别名写在用户家目录下的.bashrc文件中;
1.若是在.bashrc中进行命令别名,退出登录后仍然有效,这种永久别名只对当前用户有效;
2.写入文件后要输入source ~/.bashrc才能生效,
但是即使用一个命令永久别名了另一个命令,想使用命令本身也是在命令前面加\(譬如使用pwd命令命名了cd ./test 想使用pwd命令本身的话就在前面加个\)
如何对其它用户也生效:在/etc/profile文件里进行命令别名。
删除永久别名
使用vim .bashrc 命令进入.bashrc文件,删除你想要删除的命令别名,保存退出后进行重启就可以了。
别名优先级:
别名的优先级高于命令,如果命令已经修改,想在使用命令本身的功能,则在命令之前加\,例如:
查看别名:
查看当前用户定义的所有别名
5、变量
变量种类
环境级变量只在当前 shell 中生效, shell 关闭变量丢失
用户级变量写在用户的骨文件(.bash_profile)中,只针对当前用户生效,切换用户后就不再生效
系统级变量被写在系统的配置文件 /etc/profile 或者 /etc/profile.d/ 中,对于所有用户都生效
(在https://mp.csdn.net/mdeditor/99946984#这个博客有详解)
6、tee管道
①管道是用来过滤数据的,将输入源数据根据一定规则过滤输出到文件或终端
管道使用 | 实现数据的过滤 (过滤的是文件),例如:
②管道可以将输入流同时输出到终端和文件中,每次重新将输入流同时输出到终端和文件时,会覆盖掉上一次输入的内容,例如:
[root@localhost ~]# echo "hello" |tee 1.txt
hello
[root@localhost ~]# cat 1.txt
hello
[root@localhost ~]# echo "Linux" |tee 1.txt
Linux
[root@localhost ~]# cat 1.txt
Linux(若输入源数据过滤输出到文件时,文件并不存在,那么会自动创建一个文件并输入内容)
7、分号;
单引号''
双引号""
反单引号``
在执行多条命令时,用;分开,彼此之间不管心是否会生效,所有命令都会执行,例如:
表示切换到Test目录下后列出所有的目录和文件;
如果有命令无法执行,则执行能够执行的,例如:
" "(双引号),弱引用,可以做变量或者命令替换
保护特殊元字符和通配符不被shell解析,但是允许变量和命令替换,以及转义符的解析。它会对一些被引起来的字符进行特殊处理,例如:
' '(单引号),强引用,所见即所得
单引号''剥夺了所有字符的特殊含义,单引号内就变成了单纯的字符;
单引号和双引号的区别是:单引号里的内容仅仅表示字符,无任何特殊含义;而双引号会对双引号" "内的参数替换($)和命令替换(``),单引号,反斜杠是个例外。
变量替换:
$PWD是变量 (不需要定义)
命令替换:
` `(反单引号),命令替换
反单引号中的内容被当作命令执行;$( )与它有一样的效果:
8、Linux 输入输出重定向
Lnux 系统进程使用不同的文件描述符(FD file descriptors)来管理打开的文件 ;
Linux 系统提供如下三种I /O 设备:
①标准输入 stdin 使用文件描述符 0 代替, 0 代表来自键盘的输入;
②标准输出 stdout 使用文件描述符 1 代替,1 代表输出到屏幕;
③标准错误 stderr 使用文件描述符 2 代替,2 默认也是输出到终端窗口即屏幕;
9、重定向
重定向说白了就是不使用标准的输入输出端口,进行重新的指定,所以叫做重定向,也就是说是可以自行设定对应的设备。
①标准输入(< 与 <<)
使用< 来把文件导入到命令中,如下:
注意:虽然执行结果相同,但第一行代表是以键盘作为输入设备,而第二行代码是以 practice.txt 文件作为输入设备。
[root@localhost ~]# cat << 0
> fdscf
> sdfsf
> dfdfdf0
> dfsf
> 0
fdscf
sdfsf
dfdfdf0
dfsf可以看到,当指定了 0 作为分界符之后,只要不输入 0,就可以一直输入数据并显示出来。 输入0后,执行cat命令。 表示从标准输入设备(键盘)中读入,直到遇到分界符才停止(读入的数据可以包括分界符),这里的分界符可以为数字,字符,字母,也可以是他们的组合。
②标准输出
使用> 或者>>来将标准输入或者其他地方的输入输出到非终端窗口的设备,比如将一个命令的结果输出到文件中,我们可以通过查看文件去看对应的内容,而屏幕或终端是看不到任何内容的。如下例子:
命令符号格式 | 作用 |
---|---|
命令 > 文件 | 将命令执行的标准输出结果重定向输出到指定的文件中,如果该文件已包含数据,会清空原有数据,再写入新数据。(如果指定文件不存在,会自行创建。) |
命令 2> 文件 | 将命令执行的错误输出结果重定向到指定的文件中,如果该文件中已包含数据,会清空原有数据,再写入新数据。如果是正确的命令则不写入指定文件并且清空指定文件内容。(如果指定文件不存在,会自行创建。) |
命令 >> 文件 | 将命令执行的标准输出结果重定向输出到指定的文件中,如果该文件已包含数据,新数据将写入到原有内容的后面。 |
命令 2>> 文件 | 将命令执行的错误输出结果重定向到指定的文件中,如果该文件中已包含数据,新数据将写入到原有内容的后面。 |
命令 >> 文件 2>&1 或者 命令 &>> 文件 | 2>&1 意思是把标准错误输出重定向到标准输出,写入到指定文件,如果该文件中已包含数据,新数据将写入到原有内容的后面。 注意,第一种格式中,最后的 2>&1 是一体的,可以认为是固定写法。 第二种也是标准输出的执行结果和错误输出的执行结果追加写入到指定文件 |
命令 2>> 文件 1>&2 | 1>&2 意思是把标准输出重定向到标准错误,写入到指定文件,如果该文件中已包含数据,新数据将写入到原有内容的后面。 |
例子:
1、将正确的输出和错误的输出重定向到一个文件中:
该命令的意思列出/root和/aaa下的文件并输出到pq.txt文件中;
而/aaa是不存在的,单独使用 ls /root /aaa > p1.txt会报错,显示没有/aaa这个目录或文件,所以它是一个标准错误,而使用2>&1可以将标准输出和标准错误都输入进p1.txt文件中。
10、/dev/null与/dev/zero
/dev/null,或称空设备,是一个特殊的设备文件,它丢弃一切写入其中的数据(但报告写入操作成功),读取它则会立即得到一个EOF。
有时候我们的命令结果并不想让其输出,而是只想让其执行,就可以将其重定向到/dev/null 设备中。例如:
ls /213 /etc &> /dev/null
/dev/null 设备是我们的空设备或者叫做位桶,有时也称为黑洞,你可以向它输出任何东西,而不用担心会撑满它;或作为用于输入流的空文件。
/dev/zero 设备是我们的 0 设备,也是我们的输入设备,无限制提供 0,用于向设备或文件中写入无限制个数的字符串 0。
举例:
dd if=/dev/zero of=/opt/test bs=10M count=10
[root@centos7 opt]# ls -lh -rw-r--r-- 1 root root 100M Jul 14 15:47 test
二、Linux 常见系统管理命令详解:
ls 命令
ls 命令用来显示指定工作目录下的内容;
常用参数:
-a 列出目录下的隐藏目录
-A 列出除过.和..之外的所有文件和目录
-d 列出目录本身不包含目录下的内容
-h 以人类易读的方式显示文件的大小,通常结合-l 参数使用
-l 是长格式化的列表显示,包含文件的相关属性,比如权限,时间,大小,所属用户用户组等等
-t 以时间顺序排序,通常最新的文件或目录排在最前面,这个参数通常跟-l 一起使用
-r 是时间逆序排序(通常显示文件时是正序排序,最新时间在第一行),通常跟-lt 结合可以实现按照时间顺序从旧到新的顺序排序,也就是说新文件在最后面
-S 按照文件大小排序,通常也是结合-l 参数使用,默认是从大到小排序
-i 常与-l搭配使用,显示文件inode号
date 命令
打印系统日期和时间
-d, --date=STRING 显示时间根据你写的字符串
[root@centos7 opt]# date -d "2022-6-12 19:20:10" Sun Jun 12 19:20:10 CST 2022
-s, --set=STRING 设置时间根据你写的字符串
[root@centos7 opt]# date -s "2022-7-14 16:10:10"(日期和时间之间必须要有空格,不然格式不对) Thu Jul 14 16:10:10 CST 2022
时间格式化
% Y 年(例如:1970,2018等)
% m 月(01..12)
% d 一个月的第几天(01..31)%F full date; same as %Y-%m-%d
% H 小时(00..23)
% M 分(00..59)
% S 秒(00..59)%T time; same as %H:%M:%S
%I hour (01..12)
%R 24小时 时 和 分; same as %H:%M
举例:
1、获得当天的日期
date +%Y-%m-%d
2、获取明天的日期
date -d next-day +%Y%m%d
3、获取昨天的日期
date -d last-day +%Y%m%d
4、获取上个月的年和月
date -d last-month +%Y%m
5、获取下个月的年和月
date -d next-month +%Y%m6、获取明年的年份
date -d next-year +%Y7.获取第二天的时间
时间戳转换
时间戳记录的是 1970-1-1 以来到现在时间的总秒数,通常用在 linux 服务器中,如果需要将其转化成具体的年月日时间格式,可以使用以下方法:
[root@centos7 opt]# date --date='@2147483647'
Tue Jan 19 11:14:07 CST 2038
当然也可以用在线的 unix 时间戳转化工具实现,十分方便。