LinuxCLI常用命令!
一切皆文件!
r(readable)
=> 可读w(writable)
=> 可写x(executable)
=> 如果文件拥有该权限,则该文件可执行;如果目录拥有该权限,则可以切换目录-
=> 无权限在查看一个文件/目录权限的时候,通常会以这种形式展示:drwxr-xr-x
<br>除开第一个字母(后面会解释它的含义),可以将剩下的以三个一组,一共分为三组,从左到右依次表示:
Owner
对该文件/目录的权限Group
对该文件/目录的权限Others
对该文件/目录的权限*
=> 匹配0个或多个字符串?
=> 严格匹配1个字符[abcd]
=> 匹配abcd
4个字符当中的任意1个[a-z]
=> 匹配abcd...xyz
这26个字符当中的任意一个<br>[1-9]
等匹配规则也是同理[!abc]
=> 除了abc
这3个字符外,可以匹配任意一个<br>[^abc]
效果等价,根据个人写法习惯选择即可查看帮助手册
第一章:shell commands
=> ls, cp, mv...
等常用的命令
第二章:system calls
=> open, close, read, write...
等系统调用
第三章:library calls
=> fopen, fclose, fread, fwrite...
等库函数
第四章:special files
=> 设备文件的说明,通常指的是/dev
目录下的文件
第五章:file formats and conventions
=> 配置文件相关的说明文档,例如:/etc/passwd
第六章:games
=> 游戏相关
第七章:miscellaneous
=> 惯例与协议相关
第八章:system administration commands
=> 系统管理员会使用到的命令,通常只开放给root
用户/权限
第九章:kernel routines
=> 系统内核相关
man man
=> 查看man
命令的帮助手册<br>man ls
=> 查看ls
命令的帮助手册<br>......
man -f sleep
=> 查看sleep
命令的简要说明,会得到两条信息:
sleep(1)...
=> 第一章中sleep
命令的简要信息sleep(3)...
=> 第三章中sleep
命令的简要信息因为shell
命令中存在sleep
(位于帮助手册的第一章),库函数中也存在sleep
(位于帮助手册的第三章)
直接man sleep
默认打开的是第一章(按照章节从上往下,第一个存在该命令)的帮助手册
使用man 3 sleep
可以指定打开第三章有关sleep
函数的帮助手册
man -w ls
=> 查看ls
命令的帮助手册在磁盘当中的位置
man -k disk
=> 查看所有跟字符串disk
相关的帮助手册的简要说明,用于突然记不起具体命令但是记得其中某一部分拼写的情况<br>这里的相关不只是命令/函数名中包含,也包括描述
用来阅读info
格式的文档,查看帮助信息
相较于man
,info
所展示的帮助文档信息会更加详细全面,其中甚至不乏超链接,可以像浏览网页一样去查看,但缺点也是太过详细全面,操作繁琐,使用起来没有man
那么便捷,大多数情况下用man
命令查看就够用了。
info ls
=> 查看ls
命令的帮助文档info -w ls
=> 查看ls
命令的帮助手册(info格式)
在磁盘当中的位置查询一个命令执行什么功能
从观感上就是将man
命令查询到的各个章节的开头提取出来,某种程度上等同于man -f
whatis sleep
=> 会发现,得到的结果跟man -f sleep
一致
文件的时间属性如何查看会在后面介绍,这里只需要知道时间属性中的两个:访问时间Access
和修改时间Modify
touch file_name
=> 以当下时间为时间戳新建一个空文件,该文件名为file_name
touch file1 file2 file3
=> 同时创建三个新文件,依次命名为file1, file2, file3
,数量可以增加,中间用空格隔开touch file{1..3}
=> 同时创建三个新文件,依次命名为file1, file2, file3
,在创建文件命名有规律(连续的字符)时的一种快捷方式touch exist_file
=> 已存在的文件exist_file
的所有时间属性都更新为当下时间touch -a exist_file
=> 已存在的文件exist_file
的访问时间Access
更新为当下时间touch -m exist_file
=> 已存在的文件exist_file
的修改时间Modify
更新为当下时间touch -c nofile
or touch --no-create nofile
=> 仅用来修改已有文件的时间戳,即使nofile
不存在也不会新建touch today_file -r yesterday_file
=> 将访问和修改时间从yesterday_file
复制到today_file
touch -d "tomorrow" file
=> 将file
的访问和修改时间更改为明天touch -t 2501011000.33 file
=> 将file
的访问和修改时间更改为2025-01-01 10:00:33
,修改为任意时间同理更改格式即可创建目录
默认状态下,如果想要创建的目录已存在,则提示已存在,而不会继续创建,与文件重名也不行
mkdir dir1
=> 在当前目录下,新建一个名为dir1
的目录mkdir dir2 dir3
=> 在当前目录下,新建两个目录,分别名为dir2, dir3
,数量可以增加,中间用空格隔开mkdir dir{4..7}
=> 与前文touch file{1..3}
同理mkdir -p dir8/dir9
=> 递归创建,先在当前目录下创建dir8
目录,再在dir8
目录下创建dir9
mkdir -p dir8/dir10/dir11
=> 递归创建,由于dir8
目录已存在,所以直接进到dir8
目录下创建dir10
,此时在dir8
目录下应该有同级的两个目录,分别是dir9
和dir10
,最后在dir10
目录下创建dir11
mkdir -m 700 dir1/dir12
=> 在dir1
目录下新建目录dir12
,同时将dir12
的权限设置为700
700
权限是指:所有者可读可写可执行(切换目录),所属组和其他用户都没有读、写、执行(切换目录)的权限,相关内容后续展开mkdir -v dir{13..15}
=> 显示目录的创建过程删除文件或目录
注意:Linux没有自带的回收站,删除需谨慎,尤其是rm -rf /*
rm file
=> 删除当前目录下的file
文件rm -r dir
or rm -R dir
=> 删除当前目录下的dir
目录,其子目录也将被递归删除rm nofile
=> 尝试删除一个不存在的文件会出现警告,添加-f
即rm -f nofile
将忽略不存在的文件,不会出现警告rm -rf *
=> 删除当前目录下的所有文件rm -i file1 file2 file3
=> 删除当前目录下的三个文件,分别是file1, file2, file3
,但由于添加了-i
,所以每删除一个文件前都会询问,需要手动输入y
来确认删除,输入n
来拒绝删除即保留该文件rm -ir dir1 dir2 dir3
=> 同理,需要一个个手动确认,只不过添加了-r
,所以要删除的是目录rm file{1..3}
=> 删除当前目录下的file1, file2, file3
这三个文件删除空目录,否则将报错
由于一切皆文件,所以空目录也是占磁盘空间的,当磁盘空间爆满,到了需要删空目录来解放空间的时候,如果系统只支持rm
命令来删除,还需要在删除前进行一番判断,徒增工作量降低效率,而rmdir
则可以一步到位,空的删除,不空的保留
rmdir empty_dir
=> 删除当前目录下的空目录empty_dir
rmdir -p empty1/empty2/empty3
=> 递归删除多重目录<br>注意:此命令要求empty3
是个空目录,在删除empty3
后empty2
成为空目录,在删除empty2
后empty1
是个空目录,否则将报错
# 递归创建三个目录
mkdir -p dir1/dir2/dir3
# 进到dir1目录下创建test文件,再返回到上级目录
cd dir1
touch test
cd ..
# 尝试递归删除
rmdir -p dir1/dir2/dir3
# 警告信息:
# rmdir: dir1: Directory not empty
# 此时进到dir1目录查看
cd dir1
ls
# 将发现只有一个test文件,而dir2和dir3已经被删除
rm -v dir
=> 显示指令执行的过程<br>可以尝试将上述代码的递归删除更改为rmdir -pv dir1/dir2/dir3
,你将更清晰直观得感受到删除过程以及报错的位置与逻辑
mv file dir
=> 将当前目录下的file
文件移动至当前目录的dir
目录下mv file new_file
=> 将当前目录下的file
文件重命名为new_file
<br>注意:如果new_file
是一个已存在的文件,那么file
将覆盖掉new_file
mv dir1 dir2
=> 将dir1
目录移动到dir2
中,如果dir2
不存在则重命名mv -i file1 file2
=> 如果file2
不存在则直接重命名,如果存在这个文件,那么将询问是否将其覆盖mv -i file1 dir/file2
=> 如果dir
目录下不存在file2
文件,则将file1
文件移动到dir
目录下并且重命名为file2
<br>如果dir
目录下存在file2
文件,那么将询问是否将其覆盖mv -f file1 dir/file2
=> 强制操作,即使dir
目录下存在file2
文件,也会在不经询问的前提下将file1
转移过去并覆盖<br>注意:单就这一点而言,是否添加-f
没有影响,因为不加-f
而直接mv file1 dir/file2
也将不经询问直接覆盖mv -b file1 file2
=> 如果file2
文件已存在,则在覆盖前会将其备份,备份的内容放在文件file2~
中mv -u file1 file2
=> 如果file2
不存在,则直接重命名<br>如果file2
已存在,那么只有当file1
文件更(第四声)新的时候(从时间属性上来说),才会覆盖file2
文件,否则将忽略此条命令,并且也没有任何警告或报错mv * ../
=> 将当前目录下的所有内容都转移到上级目录mv dir1/* dir2
=> 将dir1
目录下的所有内容都转移到dir2
目录下复制文件或目录,如果目标文件已存在,将直接覆盖(与使用-f
等价)
cp file1 file2
=> 将file1
文件复制一份放到file2
中cp -r dir1 dir2
=> 递归复制,将目录dir1
复制一份放到dir2
目录中,其下的所有内容也将一并被复制cp -i file1 file2
=> 如果file2
已存在,则会提醒让你确认是否执行覆盖操作,即将file1
的内容覆盖掉原本file2
的内容cp -b file1 file2
=> 如果file2
已存在,则会先将其备份为file2~
cp -a dir1 dir2
=> 保留链接、文件属性的前提下复制目录下的所有内容改变目录,从一个目录进入到另一个目录
~
=> 用户的家目录.
=> 当前目录..
=> 当前目录的上一级目录/
=> 根目录-
=> 上一次所处的目录/
/
cd dir
or cd ./dir
=> 进入当前目录下的dir
目录cd ../..
=> 切换到当前目录的上两级目录cd
or cd ~
=> 切换到家目录cd -
=> 切换到上一次所在的目录打印当前路径(绝对路径)防止迷路
pwd
=> 屏幕上将打印你当前所处位置的绝对路径
显示指定目录下有哪些文件/目录及其具体的属性信息
ls
=> 查看当前目录下有哪些文件/目录(不包括以.
开头的隐藏内容)ls -a
=> 查看当前目录下有哪些文件/目录(包括以.
开头的隐藏内容),相较于ls
会多显示:.
=> 当前目录..
=> 上一级目录.
开头的隐藏文件/目录ls -l
=> 以长格式列出当前目录下的文件/目录信息,包括各权限,所属组,创建时间等等ls /
=> 查看根目录/
下的所有文件/目录ls -lR
=> 递归列出当前目录下以及其所有子目录下的文件/目录的信息,以长格式形式列出ls -l f*
=> 查看当前目录下所有以f
开头的文件/目录的长格式信息ls -r
=> 将文件以相反的次序显示(默认是以字典序升序,加了-r
后变为降序)ls -t
=> 根据最后修改的时间来排序显示(新的文件最先显示)ls -ltr
=> 以长格式列出信息,并且以最后修改的时间的倒序(旧的文件先显示)进行显示ls -A
=> 除了不列举.
以及..
之外,效果等同-a
ls -S
=> 按照文件大小排序ls -F
=> 在列出的文件名后根据其文件类型增加一个符号,例如:*
/
ls -h
=> 以人类可读的形式显示数字大小ls -lh
=> 列出当前目录下文件/目录的详细信息,并且显示的数字将以人类更易读的形式进行单位转换(K, M, G...)以树状形式列出目录下的内容
tree
=> 树状显示当前目录下的文件和目录tree -a
=> 树状显示当前目录下的文件和目录,包括以.
开头的隐藏文件/目录tree -d
=> 只树状显示当前目录下的目录tree -L 2
=> 树状显示当前目录下2个层级内的文件和目录tree -p
=> 除了显示文件/目录名之外,增加权限信息tree -t
=> 按更改时间进行排序tree -r
=> 反向排序tree -f
=> 显示完整的相对路径显示文件或文件系统的详细信息
文件信息:文件名、大小、块的大小、IO块的大小、文件类型、设备号、链接数、文件权限、用户名、用户组、时间属性等等
文件系统信息:文件系统ID、文件名最大长度、文件系统类型、块大小、总空间、可用空间等等
atime: access time
=> 访问时间<br>读取文件(more/less/cat/tail/...)
、修改文件(vim/nano/...)
时改变mtime: modify time
=> 修改时间<br>修改文件(vim/nano/...)
时改变ctime: change time
=> 状态改变时间<br>修改文件(vim/nano/...)
、文件属性变化(chmod/chown/...)
时改变注意:上述括号内的命令后续会提到,这里不展开
stat file
=> 查看file
文件的信息stat -f file
=> 查看file
文件所在文件系统信息stat -t file
=> 以简洁方式输出信息<br>将关键内容以空格隔开,放到一行以字符串的形式输出用字符串替换的方式批量改变具有一定规则的文件名,这也是与mv
区别的地方
rename 's/old-name/new-name/' files
old-name
=> 原字符串,即文件名中需要替换的字符串new-name
=> 目标字符串,即需要替换成为的字符串files
=> 指定要改变文件名的文件列表rename 's/.txt/.doc/' file.txt
=> 将file.txt
中的.txt
替换为.doc
,此时通过ls
查看文件,会发现file.txt
不见了,取而代之的是file.doc
rename -n 's/file/file0/' file*
=> 将所有与file*
匹配的文件名中的file
替换为file0
<br>由于添加了-n
,所以此条命令是模拟替换,不会真实生效,而是以rename(file1 file01), rename(file2, file02), ...
的形式一一列举模拟过程中会进行的替换rename -v 's/file/file0/' file*
=> 真实替换并且显示替换过程信息,如:file1 renamed as file01
等等提取文件路径名最后的文件名,可以根据需求删除指定后缀
basename /etc/passwd
=> 提取出文件名passwd
basename /usr/local/
=> 提取出目录名(会自动删除最后的/
)local
basename -a /etc/passwd /usr/local/
=> 添加-a
以支持提取多个输入,按照输入的顺序分行显示提取出的文件/目录名basename /etc/sysctl.conf .conf
=> 提取出sysctl.conf
后会删除指定后缀.conf
,所以最终得到结果为sysctl
<br>basename -s .conf /etc/sysctl.conf
与之等价<br>注意:.
不能忘,否则将会得到sysctl.
提取路径
dirname /usr/bin/cat
=> 提取找到cat
文件的路径,即得到/usr/bin
dirname /home/username/commands/
=> 提取找到commands
目录的路径,即得到/home/username
chattr
=> 更改文件属性<br>非root
用户需要用sudo
提权才能使用该命令lsattr
=> 查看文件属性A
=> 不要修改对这个文件的最后访问时间S
=> 一旦应用程序对这个文件执行了写操作,使系统立刻把修改的结果写到磁盘a
=> 系统只允许在这个文件之后追加数据,不允许任何进程覆盖或截断这个文件<br>如果拥有该属性的是目录,那么系统将只允许在这个目录下建立和修改文件,而不允许删除任何文件b
=> 不更新文件或目录的最后存取时间c
=> 将文件或目录压缩后存放d
=> 当dump
程序执行时,该文件或目录不会被dump
备份D
=> 检查压缩文件中的错误i
=> 系统将不允许对这个文件进行任何的修改<br>如果目录具有该属性,那么任何进程只能修改目录之下的文件,不允许建立和删除文件s
=> 彻底删除文件,不可恢复u
=> 当一个应用程序请求删除这个文件,系统会保留其数据块以便以后能够恢复,用来防止意外删除文件或目录t
=> 文件系统支持尾部合并X
=> 可以直接访问压缩文件的内容sudo chattr +i file
=> 为file
这个文件添加i
属性,系统将不允许任何人修改它echo 111 >> file
=> 尝试将111
追加入file
文件,将得到报错Operation not permitted
rm file
=> 尝试删除这个文件,依旧得到报错Operation not permitted
lsattr file
=> 可以观察到属性里有i
sudo chattr -i file
=> 撤销刚刚添加的i
属性,现在可以修改它sudo chattr +a file
=> 只允许在file
文件里追加内容(对日志文件特别有用)sudo chattr -R +i dir
=> 对dir
目录中的所有文件都添加i
属性限制识别文件类型
file file.txt
=> 得到其类型为ASCII text
file dir
=> 得到其类型为directory
file /dev/sda
=> 得到其类型为block special
生成和校验文件的md5值(根据内容按照某个算法算出来的32位16进制数,与文件名无关),确保文件的准确性
md5sum file
=> 生成file
文件的md5值
md5sum -b file
=> 以二进制模式读取文件再计算md5值
md5sum -t file
=> 以文本模式读取文件再计算md5值
以上不论哪一种,计算得到的md5值都是相同的,因为内容本质没有任何变化
md5sum file > file.md5
=> 计算file
文件的md5值并将结果保存到file.md5
文件中
md5sum -c file.md5
=> 校验上一个命令生成的md5值与file
文件是否一致,修改file
文件后再次执行查看是否一致
md5sum -c --status file.md5
=> md5校验但是不显示任何输出,用返回码表示成功与否<br>echo $?
=> 其中,$?
用来查询上一条命令执行的结果(0表示成功,1表示失败),echo
表示将其打印出来
搜索指定文件/目录
find / -name *.conf
=> 全盘搜索(/
根目录开始)所有以.conf
结尾的文件
find /etc -size +1k
=> 在/etc
目录下搜索所有大于1k的文件
find /home -user username
=> 在/home
目录下搜索属于指定用户username
的所有文件
上述命令可能涉及文件权限问题,可以用sudo
提权后执行
find . -type f
=> 查找当前目录下的所有文件(file
类型)
find . -perm 664 -exec ls -l {} \;
=> 查找当前目录下所有权限为664
的文件,并将其通过ls -l
进行显示
find .
=> 列出当前目录中的所有文件、目录以及子文件信息
find . -iname *.txt
=> 在当前目录中查找所有后缀为.txt
(不区分大小写)的文件
find . ! -name *.txt
=> 在当前目录中查找所有后缀不为.txt
的文件
find . -mtime -7 -exec rm -i {} \;
=> 找到当前目录下所有在7天内被修改过的文件并依次询问是否将其删除
......
在path
变量指定的路径当中,搜索某个系统命令的位置,并且返回第一个搜索结果
查看path
变量指定的路径:echo $PATH
which ls
=> 查找命令ls
所在的位置which bash
=> 查找命令bash
所在的位置查找命令的二进制程序、源代码文件和man
手册页等相关文件的路径
whereis
查找速度相当快,因为Linux系统会将系统内的所有的文件都记录在一个数据库当中,而不是在磁盘里乱找,但是这个数据库不是实时更新的(一般一天自动更新一次),所以有可能找不到刚刚添加的文件,或者找到了已被删除的文件<br>手动更新该数据库:sudo updatedb
whereis ls
=> 将显示其命令位置及man
手册页位置:ls: /usr/bin/ls /usr/share/man/man1/ls.1.gz
whereis -b ls
=> 只查找ls
命令的二进制程序所在的位置whereis -m ls
=> 只查找ls
命令的man
手册页路径快速查找文件或目录,速度比find
快,与whereis
一样,也是在数据库中搜索
locate file
=> 查找所有路径当中包含file
的文件locate /etc/sh
=> 查找所有路径中包含/etc/sh
的文件locate -i locate/f
=> 以locate
结尾的目录且该目录下含有以f
开头的文件,含有这一特点的所有文件都将被检索出来,而-i
使得检索过程当中忽略大小写改变文件或目录的用户和用户组,通常需要加上管理员权限执行
sudo chown user:group file
=> 将file
文件的用户更改为user
,用户组更改为group
sudo chown user file
=> 只更改它的用户sudo chown :group file
=> 只更改它的用户组sudo chown -c user:group file
=> 显示改变过程sudo chown -R user:group dir
=> 改变指定目录下所有子文件的所属主和所属组更改用户组,通常需要加上管理员权限
sudo chgrp group file
=> 更改file
文件的用户组为group
sudo chgrp -v group file
=> 显示命令执行过程sudo chgrp --reference=reffile file
=> 依据参照物reffile
来更改file
的用户组sudo chgrp -R group dir
=> 将指定目录下的所有子文件的所属组更改为group
改变文件/目录的权限,只有你是该文件/目录的所属主或者root
用户才可以执行
u
=> user
即文件所有者g
=> group
即文件所属组o
=> others
即其他用户a
=> all
即所有用户,相当于ugo
+
=> 增加权限-
=> 去除权限=
=> 设置权限r
=> 可读w
=> 可写x
=> 可执行/可切换目录drwxrwxrwx
将上述权限表示人为分成四个部分
(- or d)(rwx)(rwx)(rwx)
- or d
=> 表示文件类型
rwx
=> 第一组表示该文件/目录所有者所拥有的权限,按照类似二进制的规则来转化为数字:
x
=> $2 ^ 0$w
=> $2 ^ 1$r
=> $2 ^ 2$-
=> 该位为$0$例如:<br>rwx
=> $7$<br>r-x
=> $5$<br>---
=> $0$
第二组rwx
表示该文件/目录所属组所拥有的权限
第三组rwx
表示该文件/目录对其他用户开放的权限
chmod a+r file
=> 为所有all
用户添加读r
权限chmod -R a+r *
=> 为当前目录及其所有子目录下的文件都添加所有用户all
的读r
权限chmod u+x file
=> 为file
文件的拥有者user
添加可执行x
权限chmod ug+w,o-w file
=> 只有file
文件的拥有者user
及其所属组用户group
拥有对其写入w
的权限,而其他用户others
将失去对其写入w
的权限chmod a+r,a+w,a+x file
or chmod 777 file
=> file
文件对所有人all
可读r
可写w
可执行x
chmod 755 file
=> file
文件的拥有者可读可写可执行,所属组用户及其他用户可读可执行不可写chmod u=rw,go= file
=> file
文件的拥有者可读可写,所属组用户及其他用户没有任何权限文本搜索工具
grep keywords /etc/passwd
=> 在/etc/passwd
文件中搜索包含字符串keywords
的内容grep keywords file1 file2
=> 在多个文件中搜索grep -h keywords file1
=> 搜索但是结果不包含文件名grep -rl keywords *
=> 递归搜索-r
当前目录及其子目录中的所有文件,将内容含有字符串keywords
的文件的文件名的相对路径依次打印出来-l
grep -c keywords file1 file2
=> 在某个文件中,包含该关键词的内容的数量,file1
和file2
会单独统计数量grep -i KeyWords file
=> 搜索过程忽略大小写grep -n keywords file
=> 显示的结果将包含行号grep -v keywords file
=> 反向查找,即在file
文件中搜索出所有不包含字符串keywords
的内容grep -x keywords file
=> 精确搜索,即同一行内容除了字符串keywords
之外没有其它(不包括换行)才会被匹配上grep -q keywords file
=> 询问file
文件中是否含有所需要查找的字符串keywords
,此条命令不会有输出,而是通过状态值返回,可以通过$?
来获取,方便在Shell
脚本中判断和调用查找指定字符串
egrep 'a+' file
=> 在file
文件中查找包含一个或多个a
(可以间隔其它字符)的内容
egrep 'linux|666' file
=> 在file
文件中查找包含linux
或666
的内容
egrep '(linux)+' file
=> 在file
文件中查找包含一个或多个完整字符串linux
的内容
egrep '(linux){2}' file
=> 在file
文件中查找连续包含两个完整字符串linux
的内容
egrep '^#' file
=> 查找以#
开头的内容
egrep 'linux$' file
=> 查找以linux
结尾的内容
egrep 'ab[cd]' file
=> 查找含有字符串abc
或abd
的内容
上述命令的''中均为正则表达式
在终端上显示内容,一股脑输出,所以一般用来查看短小精悍的文件
cat file
=> 在终端上显示file
文件的内容cat file1 file2
=> 查看多个文件cat -n file
=> 显示行数编号,多个连续的空行也会连续编号cat -s file
=> 去除重复的空行cat -b file
=> 显示行数,但是空行不编号,不过空行依旧会存在cat -E file
=> 每一行末尾显示$
符号,包括空行cat -T file
=> 将TAB
字符显示为^I
符号cat file > output
=> 重定向输出文件内容,即不再显示到终端,而是写入output
文件<br>如果output
不存在则创建后写入,否则将覆盖内容cat file >> output
=> 重定向追加,同样不显示到终端,而是追加进output
文件<br>如果output
不存在则创建后写入,否则将追加到output
原内容的末尾cat file1 file2 > combinedfile
=> 合并文件cat > file
=> 回车后会让你输入内容,完成后按Ctrl + D
保存,你输入的内容将会被保存进file
文件分页显示文本文件内容,但是只能往下翻,不能往回翻
q
:退出more ~/.bashrc
more -c -10 ~/.bashrc
=> 先清屏,再以每次10行内容的格式显示指定文本文件内容more -s ~/.bashrc
=> 当出现多个连续的空白行的时候,将它们合并为一行more +10 ~/.bashrc
=> 从第10行开始显示分页显示文本文件内容,支持向前向后翻页<br>注意:前文提到的man
手册嵌入了less
命令,各种操作与其一致
j
:下滚一行k
:上滚一行f
:下翻一页b
:上翻一页q
:退出/word
:搜索word
关键词less ~/.bashrc
less ~/.bashrc ~/.bash_history
=> 查看多个文件n
:浏览下一个文件p
:浏览上一个文件history | less
=> 查看历史使用的命令,并将其以less
命令分页显示显示文件开头的内容
空行算作一行,空格和换行符都算作一个字符
head ~/.bashrc
=> 默认显示该文件的前10行head -n 5 ~/.bashrc
=> 显示该文件的前5行head -n -6 ~/.bashrc
=> 显示除了最后6行之外的所有内容head -c 20 ~/.bashrc
=> 显示文件的前20个字符head -c -30 ~/.bashrc
=> 显示除了最后30个字符之外的所有内容查看文件结尾的内容
空行算作一行,空格和换行符都算作一个字符
tail ~/.bashrc
=> 默认显示该文件的最后10行tail -n 20 ~/.bashrc
=> 查看最后20行内容tail -n +20 ~/.bashrc
=> 查看从文件第20行开始一直到文件末尾tail -c 10 ~/.bashrc
=> 查看最后10个字符tail -f file
=> 动态显示文件的最后10行<br>此时另起一个终端,往file
文件里加内容,再切换回执行了该命令的终端,可以发现该新添加的内容<br>该命令应用于日志文件特别有效反向显示文件内容,以行为单位,与cat
的显示顺序正好相反
tac file
=> 先显示最后一行,再显示倒数第二行...最后显示第一行
添加行号
nl file
=> 列出file
文件的内容,同时添加行号,空行不显示行号nl -b a file
=> 空行显示行号nl -b a -n rz file
=> 行号在自己栏位的最右侧显示,并且加前导零使得格式对齐,宽度默认为6为,即:第一行显示为000001nl -b a -n rz -w 3 file
=> 将宽度更改为3,即:第一行显示为001nl -b t file
=> 空行不显示行号(与不加任何参数时等价)统计文本信息
wc file
=> 统计该文件的行数、字数(由空白、跳格或换行符分隔的字符串)以及字节数(包括可见字符和不可见字符)
注意:一个字符可能占多个字节,例如:在UTF-8编码中,一个英文字母占一个字符,占用空间一个字节,而一个中文,则需要占用三个字节大小
wc -w file
=> 统计字数
wc -m file
=> 统计字符数
wc -c file
=> 统计字节数
wc -l file
=> 统计行数
wc -L file
=> 打印该文件最长行的长度(不包含不可见字符)
文件分割<br>默认按每1000行分割成一个小文件<br>默认情况下,分割成的文件按照以下规律依次命名:xaa, xab, xac, ......
split -2 file
=> 将file
文件的内容按照每两行切割成一个小文件split -b 10k file
=> 根据文件大小,每10kb切割成一个小文件split -d -a 3 file
=> 切割成的文件以数字进行命名,命名宽度为3,即:x000, x001, x002, ......
split -d -a 3 file split_file
=> 切割成的文件拥有指定前缀,即:split_file000, split_file001, split_file002, ......
<br>注意:该命令中,要切割的文件file
和指定前缀字符串split_file
的顺序不能颠倒从文件中提取文本的一部分
cut -f 2 file
or cut -f2 file
=> 提取file
文件当中第二列的内容<br>默认情况下,cut
命令会将一行内容依据制表符TAB
分成若干列cut -f2 --complement file
=> 提取除第二列之外的内容cut -f2 -d";" file
=> 提取第二列,但是一行内容将以分号来分成若干列cut -b 2-4,6 file
=> 提取每一行的第2, 3, 4, 6个字节的内容cut -c1-3 file
=> 提取每一行的第1, 2, 3个字符的内容cut -c-2 file
=> 提取每一行的前两个字符的内容cut -c4- file
=> 提取每一行的第四个字符及其后的内容合并两个或多个文件
paste file1 file2
=> 按照纵列将两个文件拼接起来,键入命令中的文件顺序不同,结果也不同<br>想要拼接更多的文件,只需要在命令后继续输入文件名即可<br>注意:如果文件中的行数不同,那么缺失位置将用空白字符填充paste -d":" file1 file2 file3
=> 合并文件的时候,每一行的内容以:
来分隔<br>注意:如果文件中的行数不同,又指定了分隔符(以:
为例),那么最后一行就可能出现::words
之类的形式(因为前两个文件内容较少)paste -d":" -s file1 file2
=> 每个文件内部用:
替换掉换行符组成一个一行的字符串,再将若干个字符串一行一行拼接ls | paste -d " " - - - -
=> 将ls
的结果进行paste
命令,将以空格进行分隔,并依次组成四列的形式对文本内容进行排序
sort file
=> 按字母字典序升序进行排序sort -r file
=> 按字母字典序降序进行排序sort -n number_file
=> 按照数字本身(从小到大)进行排序sort -n -r number_file
=> 从大到小sort -t : -k 3 -n file
=> 首先将每一行按照:
进行分隔,按照第三列的数字本身从小到大的顺序来确定行的顺序去除文件中的重复行
注意:这里的重复行必须是连续的重复行,如果中间被什么东西分隔开就不行
uniq file
=> file
文件中每一重复的连续行都将只剩下一行内容uniq -c file
=> 去除重复行的同时统计每一行所在原文有多少重复行uniq -d file
=> 只显示有重复的记录,且每个记录只出现一次uniq -u file
=> 只显示没有重复的记录逐行比较文件差异,并且可以生成补丁文件
a
=> 增加c
=> 改变d
=> 删除|
=> 前后两个文件内容有不同<
=> 后面文件比前面文件少了一行内容>
=> 后面文件比前面文件多了一行内容+
=> 比较的文件的后者比前者多一行-
=> 比较的文件的后者比前者少一行!
=> 两个文件有差别的行diff file1 file2
=> 逐行比较并在每一个有差异的地方用上述符号进行展示diff -y -W 50 file1 file2
=> 并排格式输出,设置间隔宽度为50,同时在每一个有差异的地方用上述符号进行展示,相较于上一个命令,并排显示会更加直观diff -c file1 file2
=> 上下文格式输出diff -u file1 file2
=> 统一格式输出diff file1 file2 > file.patch
=> 生成补丁<br>如果为file1
文件打上这个生成的补丁,那么它的内容将与file2
完全一致patch file1 file.patch
=> 为file1
文件打上刚刚生成的补丁连接两个文件当中相同的连接字段后的内容
join file1 file2
=> 默认以第一列为连接字段
cat file1
# output:
1 username 99
2 test 100
3 pp jj
cat file2
# output:
1 username 1
2 jj pp
4 963 369
join file1 file2
# output:
1 username 99 username 1
2 test 100 jj pp
join -a1 file1 file2
=> 左边文件,即file1
当中未匹配上连接字段的内容也将显示
join -a2 file1 file2
=> 右边文件,即file2
当中未匹配上连接字段的内容也将显示
join -a1 -a2 file1 file2
=> 两个文件当中未匹配上连接字段的内容也将显示<br>显示顺序:<br>1. 匹配上连接字段的内容<br>2. 左边文件,即file1
当中未匹配上连接字段的内容<br>3. 右边文件,即file2
当中未匹配上连接字段的内容
join -o 1.2 1.3 2.3 file1 file2
=> 如果匹配上连接字段,那么将截取第一个文件file1
的第二第三个字段与第二个文件file2
的第三个字段组合在一起<br>注意:计算第几个字段时需要考虑连接字段(它也占个数)
join -t ' ' file1 file2
=> 指定分隔符
join -v 1 file1 file2
=> 只显示第一个文件,即file1
文件当中,未能匹配上连接字段的内容
join -j 2 file1 file2
=> 指定以两个文件当中的第二个字段作为连接字段进行匹配<br>注意:输出结果时,会自动将连接字段放在第一位
转换或删除文件中的字符
tr "[a-z]" "[A-Z]" < file
=> 对file
文件当中的内容进行小写到大写转换cat file | tr a-z A-Z
=> 对file
文件当中的内容进行小写到大写转换echo "hello world" | tr [:lower:] [:upper:]
=> 对字符串hello world
进行小写到大写转换[:alnum:]
=> 字母和数字[:alpha:]
=> 字母[:cntrl:]
=> 控制(非打印)字符[:digit:]
=> 数字[:graph:]
=> 图形字符[:lower:]
=> 小写[:upper:]
=> 大写[:print:]
=> 可打印字符[:punct:]
=> 标点符号[:space:]
=> 空白字符[:xdigit:]
=> 十六进制字符echo "Hello World" | tr "[A-Za-z]" "[a-zA-Z]"
=> 将字符串Hello World
当中的大小写字符互换echo "daflenDAGDNfdsaf" | tr -d "[a-z]"
=> 将字符串daflenDAGDNfdsaf
中的小写字母删除tr -d 0-9
=> 删除某一段内容中的数字<br>tr -d "[ \t]"
=> 删除某一段内容中的空格和tab符<br>tr -d -c "0-9\n"
=> 删除某一段内容中的,不在指定集合中的字符echo -e "1\n\n\n2\n\n3\n\n\n" | tr -s "\n"
=> 压缩重复的空白行<br>注意:echo -e
表示后面紧跟的字符串中需要进行转译,这个例子当中就是需要将\n
转译为换行符tr -s "[ xo]"
=> 在某一段内容中,删除字符集中的重复字符<br>tr -s " " "-"
=> 在某一段内容中,将连续的空格压缩为一个空格,并将空格替换为-
echo -e "hello\tworld" | tr "\t" " "
=> 将制表符替换为空格批量编辑文本文件(行处理)
a
=> 新增c
=> 取代d
=> 删除i
=> 插入p
=> 打印s
=> 取代注意:默认情况下,该命令并非直接修改文件中的内容,而是将处理后的结果输出,文件内容保持不变
sed -n '2p' file
=> 仅输出file
文件的第二行sed -n '3,5p' file
=> 输出第三、第四、第五行sed -n '/an/p' file
=> 输出带有关键词an
的行<br>搜索支持使用正则表达式sed '2,4d' file
=> 删除第二、第三、第四行的内容并输出到屏幕上sed '/an/d' file
=> 删除带有关键词an
的行sed '2a nice' file
=> 在第二行后追加一行字符串nice
sed '2i 123456789' file
=> 在第二行前插入一行字符串123456789
sed '2c asdfgh' file
=> 将第二行整行替换成字符串asdfgh
sed '2,5c data changed' file
=> 将第二行、第三行、第四行、第五行的内容替换成一行字符串data changed
<br>注意:并不是将第2-5行每一行都替换成该字符串,而是将第2-5行视为一个整体,用一个字符串将这个整体替换sed 's/oldstring/newstring/g' file
=> 全局替换g
,把oldstring
替换为newstring
sed '3s/oldstring/newstring/g' file
=> 只将第三行的oldstring
替换为newstring
sed -e 's/oldstring//g;s/yyds/newstring/g' file
=> 多条件替换-e
,将oldstring
替换为空字符串(等同于删除),同时将yyds
替换为newstring
sed -i '3s/oldstring/newstring/g' file
=> 将第三行的oldstring
替换为newstring
,同时将修改后的结果写入file
文件对文本和数据进行处理的编程语言,不过一般只是使用它进行内容提取(列处理),而编程部分则交给Shell
df -h | awk '{print $1 "\t" $3}'
=> 对df -h
输出的内容进行处理,打印其第一列、第三列,中间用tab符隔开
awk -F : '{print $1 "\t" $3}' /etc/passwd
=> 处理/etc/passwd
文件,用冒号作为分隔符将每一行分成若干列(默认情况下以空白字符作为分隔符),然后提取显示其第一列、第三列的内容,中间用tab符隔开
awk -F : '$3>=500' /etc/passwd
=> 将/etc/passwd
文件中,以冒号分隔后的第三列中的数据不小于500的行提取出来,提取出来的结果没有被用冒号分割
awk -F : '/username/' /etc/passwd
=> 搜索/etc/passwd
文件中有关键词username
的内容,并打印出所在的行的原内容
awk -F : '/username/{print $7}' /etc/passwd
=> 搜索/etc/passwd
文件中有关键词username
的内容,并打印出所在的行的第七列内容
head /etc/passwd | awk -F : 'BEGIN{print "name\tuid"}{print $1 "\t" $3}END{print "from file /etc/passwd"}'
=> 用head
命令提取/etc/passwd
文件的前十行,用awk
对这十行内容进行处理:
-F :
=> 用冒号将每一行分割成若干列
BEGIN{print "name\tuid"}
=> 打印name uid
,中间为制表符
{print $1 "\t" $3}
=> 提取并打印用冒号分隔后的第一列和第三列内容,中间用制表符隔开
END{print "from file /etc/passwd"}
=> 打印from file /etc/passwd
其中,BEGIN
表示在处理之前执行,END
表示在处理之后执行
查看磁盘使用空间
du
=> 查看当前目录下所有文件和目录的容量大小du -h dir
=> 以易读的方式显示dir
目录及其子目录大小du -ah dir
=> 以易读的方式显示dir
目录内所有文件的容量大小du file
=> 单独查看file
文件所占用的磁盘空间(一般都会加上-h
选项易读)du -s dir
or du --max-depth=0 dir
=> 仅查看dir
目录的总大小(一般都会加上-h
选项易读)查看磁盘使用了多少空间以及剩余多少空间等信息
df
=> 显示磁盘使用空间情况df -h
=> 以易读的方式显示df /home
=> 显示指定文件/目录所在分区的磁盘空间使用情况df -t squashfs
=> 查看指定文件类型的磁盘使用情况df -i
=> 以inode
模式来显示磁盘空间使用情况df -a
=> 显示所有信息,包含具有0 Blocks的文件系统df -T
=> 列出文件系统的类型强制将更改的内容立刻写入磁盘(一般情况下不需要手动执行)
在Linux系统中,在对文件或数据处理的过程中,一般都会先将其先放到内存的缓冲区,等到适当的时机再写入磁盘,以提高系统的运行效率
把文件系统(一般指被格式化后的硬盘或分区设备,如:U盘、光驱等等)挂载到目录,之后,用户就可以直接在挂载的目录当中操作该文件系统
使用该命令需要管理员权限
mount
=> 查看当前系统中挂载的所有文件系统信息mount -t tmpfs
=> 查看指定类型挂载的文件系统sudo fdisk -l | grep sd
=> 查看系统当中已具有哪些sd
设备<br>sudo mkdir /mnt/udisk
=> 一般都会挂载都/mnt
目录下,如果设备过多,为了方便管理,可以在该目录下新建一个目录<br>sudo mount /dev/sdb /mnt/udisk
=> 将第一步中查看到的我们需要挂载的设备(如:U盘)挂载到/mnt/disk
目录<br>注意:多个设备可以挂载到同一个目录,但是后挂载的设备会将之前挂载的设备的内容隐藏sudo umount udisk
=> 解除挂载sudo mount -o ro /dev/sdb /mnt/udisk
=> 只读模式挂载<br>注意:无法在以可读可写的方式挂载的同时又在新目录以只读模式挂载,此时需要用上一条命令umount
来解除可读可写的挂载sudo mount -o loop /home/username/commands/mount/mydisk.iso /mnt/iso
=> 将iso镜像挂载到/mnt/iso
目录卸载已经安装的文件系统目录或文件
sudo umount /dev/sdb
=> 通过设备名卸载sudo umount /media/username/devicename
=> 通过挂载点卸载拷贝及转换文件
可以完整拷贝文件,可以部分拷贝文件,也可以在拷贝的过程当中对内容进行转换
同时,利用该命令,可以测试磁盘的读取与写入速度
if=file
=> 默认从标准输入,即指定源文件of=file
=> 默认从标准输出,即指定目标文件ibs=bytes
=> 一次读入bytes
个字节,即指定一个块大小为bytes
个字节obs=bytes
=> 一次输出bytes
个字节,即指定一个块大小为bytes
个字节bs=bytes
=> 同时指定一次输入/输出bytes
个字节cbs=bytes
=> 一次转换bytes
个字节,即指定转换缓冲区大小skip=blocks
=> 从输入文件的开头跳过blocks
个块后再开始拷贝seek=blocks
=> 从输出文件的开头跳过blocks
个块后再开始拷贝count=blocks
=> 仅拷贝blocks
个块,一个块大小等于ibs/obs
指定的字节数conv=<keywords>
=> 指定关键字conversion
=> 用指定的参数转换文件ascii
=> 转换ebcdic
为ascii
ebcdic
=> 转换ascii
为ebcdic
ibm
=> 转换ascii
为alternate ebcdic
block
=> 把每一行转换为长度为cbs
字节的内容,不足的部分用空格填充unblock
=> 使每一行的长度为cbs
,不足的部分用空格填充lcase
=> 大写转小写ucase
=> 小写转大写swab
=> 交换输入的每对字节noerror
=> 出错时不停止notrunc
=> 不截断输出文件sync
=> 将每个输入快填充到ibs
个字节,不足部分用空(NULL)字符补齐dd if=/dev/zero of=file bs=500M count=1
=> 生成一个500M的文件<br>从/dev/zero
文件中拷贝500M数据,一共拷贝一次,将这些数据写入一个名为file
的文件中<br>注意:/dev/zero
是一个特殊文件,它将源源不断为你提供0这个数据dd if=file1 of=file2 bs=50 count=1
=> 拷贝指定文件file1
的前50个字节到目标文件file2
中dd if=file1 of=file2 conv=ucase
=> 拷贝指定内容,同时小写转大写dd conv=ucase
=> 回车后在终端输入任意字符,按ctrl + d
结束,转化为大写后的结果也将在终端显示打包/解压工具
-c
=> 新建打包文件-x
=> 解压文件,配合-C
解压到对应的文件目录-f
=> (压缩或解压时)指定要处理的文件-j
=> 通过bzip2
方式压缩或解压,最后以.tar.br2
为后缀。压缩后大小小于.tar.gz
-z
=> 通过gzip
方式压缩或解压,最后以.tar.gz
为后缀,一般使用得比较多-v
=> 显示操作过程-t
=> 查看打包文件中的内容-C dir
=> 指定压缩/解压缩的目录,若无指定,默认是当前目录tar -cvf files.tar *
=> 将当前目录下所有文件打包(未压缩),并显示操作过程tar -zcvf files.tar.gz *
=> 将当前目录下所有文件用gzip
方式压缩,并显示操作过程tar -zxvf files.tar.gz
=> 解压文件到当前目录下,如果当前目录下已存在文件则会被覆盖tar -zxvf files.tar.gz -C dir
=> 解压文件到当前目录的dir
目录下tar -tf files.tar.gz
=> 列出压缩包里的内容压缩/解压,以.zip
后缀结尾
zip -r dir.zip dir
=> 将dir
目录下的所有文件和子目录用zip
格式压缩成一个压缩包dir.zip
zip files.zip *.txt
=> 将当前目录下所有以.txt
结尾的文件用zip
格式压缩成一个压缩包files.zip
zip -dv files.zip new_file
=> 将当前目录下的new_file
文件添加-d
进已有的压缩包files.zip
中,并且显示操作过程-v
unzip -l files.zip
=> 查看压缩包中的文件unzip -v files.zip
=> 查看压缩包中的文件及其压缩比率unzip -t files.zip
=> 检查压缩包是否被损坏unzip files.zip
=> 解压压缩包到当前目录下unzip files.zip -d dir
=> 解压压缩包到指定目录下dir
压缩/解压文件,以.gz
后缀结尾,对文本的压缩比率通常能够达到60% ~ 70%
gzip file
=> 压缩file
文件,默认压缩后的文件名为该文件名加上对应的后缀,即:file.gz
。与此同时,原文件将被删除gzip -r dir
=> 压缩dir
目录,但是dir
目录不会被压缩,切换进该目录后,发现该目录下所有文件单独被压缩了,命名方式如上,且各个文件都会被删除gzip -l *
=> 查看当前目录下所有压缩包的信息,包括压缩比率gzip -dv file.gz
or gunzip -v file.gz
=> 解压指定压缩包文件,并且显示操作过程-v
,如果存在同名文件则会被覆盖gzip -dr dir
or gunzip -r dir
=> 递归解压该目录下的所有压缩包文件gzip -k file
=> 压缩指定文件,但是不删除原文件gunzip -t file.gz
=> 测试指定压缩包文件内容是否被损坏显示系统信息
a
=> 系统所有相关信息m
=> 计算机硬件架构n
=> 主机名称r
=> 内核发行版本号s
=> 内核名称,如果直接使用uname
命令,则默认加上该参数v
=> 内核版本p
=> 处理器类型o
=> 操作系统名称i
=> 硬件平台uname -a
=> 显示系统主机名、内核版本、硬件架构等全部信息uname -n
=> 显示系统主机名uname -r
=> 显示内核发行版本号显示和设置系统的主机名
hostname
=> 显示主机名sudo hostname newname
=> 临时改变主机名,系统重启后失效hostname -I
=> 显示主机的所有IP地址方法1:修改配置文件
sudo vim /etc/hostname
=> 修改其中内容sudo vim /etc/hosts
=> 将其中当前的主机名修改为想要更新为的主机名方法2:hostnamectl
命令
sudo hostnamectl set-hostname newhostname
=> 利用命令设置新主机名sudo vim /etc/hosts
=> 将其中当前的主机名修改为想要更新为的主机名不难发现,两个方法中的第一步最终导致的结果是等价的,第二步是完全相同且必不可少的
显示开机信息
开机信息一般保存在内核的环形缓冲区中:/var/log/dmesg
dmesg
=> 显示开机信息dmesg | less
=> 用less
进行分页查看dmesg | grep -i memory
=> 显示与内存相关的信息dmesg | grep -i usb
=> 显示与usb相关的信息dmesg -x
=> 显示信息级别,如:alert, err, warn, info, debug......
dmesg --level=err,warn
=> 只显示指定级别的信息dmesg -T
=> 显示时间戳dmesg -r
=> 显示原始数据sudo dmesg -c
=> 清空dmesg
环形缓冲区中的日志查看系统启动时间及负载信息
uptime
=> 显示当前系统运行负载信息uptime -p
=> 显示系统正常运行的时间uptime -s
=> 显示系统启动时间显示系统内存使用量情况
b
=> 以Byte
显示内存使用情况k
=> 以kb
显示内存使用情况m
=> 以mb
显示内存使用情况g
=> 以gb
显示内存使用情况s
=> 持续显示t
=> 显示内存使用总和h
=> 以易读的单位显示内存使用情况Mem
行(第二行)是内存的使用情况Swap
行第三行是交换空间的使用情况total
列显示系统总的可用物理内存和交换空间used
列显示已经被使用的物理内存和交换空间free
列显示还有多少物理内存和交换空间可供使用shared
列显示被共享使用的物理内存大小buff/cache
列显示被buffer
和cache
使用的物理内存大小available
列显示还可以被应用程序使用的物理内存大小free
=> 以默认的容量单位显示内存使用量情况free -m
=> 以mb
为单位显示free -h
=> 以易读的单位显示(不统一单位,而是某个数字在哪个单位下易读就以哪个为单位显示)free -hs 3
=> 以易读的单位显示,每3秒刷新一次Shell
的内建命令,用来控制Shell
程序的资源,以达到系统调优的作用
-a
=> 显示目前资源限制的设定-c <core文件上限>
=> 设定core
文件的最大值,单位为区块-d <数据节区大小>
=> 程序数据节区的最大值,单位为kb
-f <文件大小>
=> Shell
所能建立的最大文件,单位为区块-H
=> 限制资源的硬性限制,也就是管理员所设下的限制-m <内存大小>
=> 指定可使用的内存上限,单位为kb
-n <文件数目>
=> 指定同一时间最多可开启的文件数-p <缓冲区大小>
=> 指定管道缓冲区的大小,单位为512字节-s <堆栈大小>
=> 指定堆栈上限,单位为kb
-S
=> 设定资源的弹性限制-t <CPU时间>
=> 指定CPU
使用时间的上限,单位为秒-u <程序数目>
=> 用户最多可开启的程序数目-v <虚拟内存大小>
=> 指定可使用的虚拟内存上限,单位为kb
ulimit -a
=> 显示系统资源的所有设置ulimit -n 2048
=> 将每个进程可以打开的文件数目加大到2048切换系统运行级别
init 0
=> 关机init 1
=> 单用户模式init 2
=> 多用户,没有NFS不联网init 3
=> 多用户-命令行模式init 4
=> 没有用到init 5
=> 图形化界面模式init 6
=> 重新启动控制系统服务,可以启动、停止、重新启动甚至直接关闭某个系统服务
service --status-all
=> 查看系统中所有服务现在的状态service sshd status
=> 查看sshd
运行状态service sshd start
=> 启动sshd
服务service sshd stop
=> 停止sshd
服务service sshd restart
=> 重启sshd
服务显示虚拟内存状态,显示系统的进程、内存等整体的运行状态
vmstat
=> 显示虚拟内存使用情况vmstat 1 3
=> 每隔1秒采样一次,总共采样3次vmstat -a
=> 显示活跃和非活跃内存统计信息vmstat -f
=> 显示从系统启动以来的fork数量vmstat -s
=> 显示详细信息vmstat -d
=> 显示磁盘相关的信息(读/写情况)vmstat -p /dev/sda1
=> 查看/dev/sda1
这个磁盘分区的读/写情况sudo vmstat -m
=> 显示系统的slabinfo监视系统输入输出设备和CPU使用情况
iostat
=> 显示所有设备负载情况iostat 2 3
=> 每隔2秒显示一次,总共显示3次iostat -d sda1
=> 显示指定磁盘信息iostat -t
=> 显示tty和cpu信息iostat -m
=> 以M为单位显示iostat -d -k 1 1
=> 查看tps和吞吐量信息iostat -x /dev/sda1
=> 查看磁盘I/O详细情况iostat -d -x -k 1 1
=> 查看设备使用率%util
、响应时间await
iostat -c 1 3
=> 查看CPU状态显示进程间通信设备的状态,包括消息队列、共享内存以及信号量的信息
ipcs
or ipcs -a
=> 显示所有的IPCipcs -t
=> 输出信息的详细变化时间ipcs -p
=> 输出IPC方式的进程IDipcs -c
=> 输出IPC方式的创建者/拥有者ipcs -u
=> 输出当前系统下IPC各种方式的状态信息ipcs -l
=> 查看各个资源的系统限制信息删除一个或更多的消息队列、信号量集或者共享内存标识,同时将其(IPC对象)
所关联的数据一并删除
只有超级用户以及IPC对象的创建者有权限删除
注意:删除可能用到的id
或key
需要通过ipcs -c
或ipcs
查看
ipcrm -m id
=> 通过id
删除共享内存ipcrm -M key
=> 通过key
删除共享内存ipcrm -q id
=> 通过id
删除消息队列ipcrm -Q key
=> 通过key
删除消息队列ipcrm -s id
=> 通过id
删除信号量ipcrm -S key
=> 通过key
删除信号量ipcrm -a
=> 删除所有共享内存、消息队列和信号量ipcrm -v -a
=> 删除所有共享内存、消息队列和信号量,并且显示过程显示并设置IP路由表
-n
=> 不要使用通讯协议或主机名称,直接使用IP
或port number
-net
=> 表示后面接的路由为一个网域-host
=> 表示后面接的为连接到单部主机的路由netmask
=> 与网域有关,可以设定netmask
决定网域大小gw
=> gateway
的缩写,后续接的是IP
的数值,与dev
不同dev
=> 表示路由必须要经过的网关,后面接eth0
等U(Up)
=> 表示此路由当前为启动状态H(Host)
=> 表示此网关为一主机G(Gateway)
=> 表示此网关为一路由器R(Reinstate Route)
=> 使用动态路由重新初始化的路由D(Dynamically)
=> 此路由是动态性地写入M(Modified)
=> 此路由是由路由守护进程或导向器动态修改!
=> 表示此路由当前为关闭状态route
or route -n
=> 显示当前路由sudo route add -net 224.0.0.0 netmask 240.0.0.0 dev ens33
=> 添加网关/设置网关sudo route add -net 224.0.0.0 netmask 240.0.0.0 reject
=> 屏蔽一条路由sudo route del -net 224.0.0.0 netmask 240.0.0.0
or sudo route del -net 224.0.0.0 netmask 240.0.0.0 reject
=> 删除路由记录测试主机间网络连通性,测试网速等
-c
=> 指定发送报文的次数-i
=> 指定收发信息的间隔时间-s
=> 设置数据包的大小-t
=> 设置存活数值TTL
的大小Linux
系统的TTL
值为64或255Windows NT/2000/XP
系统的TTL
值为128Windows 98
系统的TTL
值为32UNIX
主机的TTL
值为255ping www.baidu.com
=> 测试与www.baidu.com
网站的连通性ping -c 4 www.baidu.com
=> 连续ping
四次ping -c 4 -i 3 www.baidu.com
=> 连续ping
四次,每次之间间隔三秒ping <IP Address>
=> 测试局域网连通性<br>例如:测试局域网与物理机之间的网络连通性,需要提前知道物理机的IP
地址是多少ping -s 1024 -t 255 www.baidu.com
=> 设置数据报为1024字节,TTL为255追踪数据包在网络上传输时的全部路径
试图以最小的TTL
发出探测包来追踪数据包到达目的主机所经过的所有网关,然后监听来自网关ICMP
的应答。一条路径上,每个设备traceroute
都会测三次
traceroute www.baidu.com
=> 追踪本地数据包到百度的传输路径traceroute -m 7 www.baidu.com
=> 追踪指定量的跳数traceroute -n www.baidu.com
=> 显示IP
地址而非主机名traceroute -q 4 www.baidu.com
=> 设置探测包的个数traceroute -w 3 www.baidu.com
=> 设置对外发探测包的等待时间,以秒为单位traceroute -p 6888 www.baidu.com
=> 设置基本UDP
端口traceroute -r www.baidu.com
=> 绕过正常的路由表,直接发送到网络相连的主机显示或设置网络设备参数信息
通常不建议直接使用ifconfig
命令来修改配置网络信息,因为一旦重启,配置过的参数就会失效
ifconfig
=> 显示网络设备信息sudo ifconfig eth0 up
/ sudo ifconfig eth0 down
=> 打开/关闭指定网卡sudo ifconfig eth0 192.168.1.56
=> 为网卡eth0
配置IP
地址sudo ifconfig eth0 192.168.1.56 netmask 255.255.255.0
=> 为网卡eth0
配置IP
地址与子网掩码sudo ifconfig eth0 192.168.1.56 netmask 255.255.255.0 broadcast 192.168.1.255
=> 为网卡eth0
配置IP
地址、子网掩码以及广播包sudo ifconfig eth0 add <IPv6 Address>
=> 为网卡设置IPv6
地址sudo ifconfig eth0 del <IPv6 Address>
=> 为网卡删除IPv6
地址sudo ifconfig eth0 down
<br>sudo ifconfig eth0 hw ether <MAC Address>
<br>sudo ifconfig eth0 up
<br>先关闭,然后修改MAC
地址,最后再启动sudo ifconfig eth0 arp
/ sudo ifconfig eth0 -arp
=> 启动/关闭ARP
协议sudo ifconfig eth0 mtu 1500
=> 设置最大传输单元为1500字节激活/禁用网络接口
sudo ifup eth0
=> 激活eth0
网络接口sudo ifdown eth0
=> 关闭eth0
网络接口显示网络状态,包括路由表、实际网络连接、每一个网络接口等
netstat -a
=> 显示系统网络状态中的所有连接信息netstat -at
=> 显示TCP
连接信息netstat -au
=> 显示UDP
连接信息netstat -p
=> 显示PID
和进程名netstat -l
=> 显示监听端口netstat -lt
=> 显示TCP
监听端口netstat -lu
=> 显示UDP
监听端口netstat -lx
=> 显示UNIX
监听端口netstat -s
=> 显示所有端口的统计信息netstat -st
=> 显示TCP
端口的统计信息netstat -su
=> 显示UDP
端口的统计信息netstat -apu
=> 显示UDP
连接端口号使用信息netstat -i
=> 显示网卡当前状态信息netstat -r
=> 显示网络路由表状态信息netstat -ap | grep ssh
=> 找到某个服务器所对应的连接信息显示活动套接字信息
-n
=> 不解析服务名称,以数字方式显示-a
=> 显示所有套接字-l
=> 显示处于监听状态的套接字-o
=> 显示计时器信息-e
=> 显示详细的套接字信息-m
=> 显示套接字的内存使用情况-p
=> 显示使用套接字的进程-i
=> 显示内部的TCP
信息-s
=> 显示套接字使用概况-4
=> 仅显示IPv4
的套接字-6
=> 仅显示IPv6
的套接字-O
=> 显示PACKET
套接字-t
=> 仅显示TCP
套接字-u
=> 仅显示UDP
套接字-d
=> 仅显示DCCP
套接字-w
=> 仅显示RAW
套接字-x
=> 仅显示UNIX
套接字-D
=> 将原始TCP
套接字信息转储到文件ss -at
=> 显示TCP
套接字ss -au
=> 显示UDP
套接字ss -s
=> 显示套接字使用概况ss -l
=> 列出所有打开的网络连接端口ss -lp
=> 查看进程使用的socket
ss -lp | grep 6010
=> 找出打开套接字/端口的应用程序ss -tnl
=> 查看主机监听的端口ss -tlr
=> 解析IP
和端口号远程登入服务器,但是它采用的是明文的传送报文,安全性不强
telnet <address>
=> 远程登录telnet <address> <port>
=> 指定端口远程连接工具,使用ssh
加密协议,安全性高
配置文件:/etc/ssh/sshd_config
ssh <address>
=> 远程登录ssh <username@address>
or ssh -l <username@address>
=> 以username
身份远程登录ssh -p <port> <username@address>
=> 指定端口号及用户名远程登录ssh <address> date
=> 远程执行命令,并且在终端返回结果文件传输协议客户端工具,数据未加密,安全性不高
sudo gedit /etc/vsftpd.conf
#write_enable=YES
前的#
,即去除该行的注释符号sudo service vsftpd restart
ftp <address>
=> 建立FTP
连接get file
=> 下载文件mget file1 file2
=> 下载多个文件put file
=> 上传文件mput file1 file2
=> 上传多个文件交互式的文件传输工具,数据使用ssh
加密,安全性高
sftp <username@address>
=> 连接服务器sftp -P <port> <username@address>
=> 指定端口help
or ?
=> 查看支持的命令get file
=> 从远程服务器下载文件get -r dir
=> 从远程服务器下载目录put file
=> 从本地上传文件put -r dir
=> 从本地上传目录!command
=> 执行本地Shell
命令,如:!echo hello world
bye
or exit
=> 退出连接功能强大的下载工具,支持很多协议:ftp, ftps, http, https...
界面及功能非常像Shell
,允许多个后台任务执行,书签排队,镜像,断点续传,多线程下载等
lftp <username@address>
=> 远程登录help
or ?
=> 查看支持的命令get file
or mget file*
or mget -c *.txt
=> 下载文件/多个文件到本地<br>如果文件已存在,会报错,不会覆盖,但不会影响其它文件传输<br>-c
=> 断点续传,如果网络不稳定,或者文件比较大,下次下载的时候就可以直接在上一次传输的中途继续下载mirror dir
=> 下载目录到本地put file
or mput *
=> 从本地上传文件/多个文件mirror -R dir
=> 从本地上传目录bye
or exit
=> 退出连接从指定的url
上去下载文件,支持断点下载
如果下载的内容与已存在的内容重名了,那么新下载的内容会自动在文件名末尾添加.1
之类的标识以区分
-i
=> 下载指定文件里列出的地址-O
=> 下载后重命名文件-c
=> 打开断点续传-b
=> 启动后转入后台执行-P
=> 指定保存路径wget https://...
=> 下载单个文件vim urllist
<br>wget -i urllist
<br>=><br>在urllist
文件中键入所有需要下载的文件的地址,然后使用-i
参数从文件里列出的地址一一下载wget -O rename https://...
=> 将下载的文件重命名为rename
wget -P dir https://...
=> 将下载的文件保存到指定的目录dir
wget --limit-rate=300k https://...
=> 限速下载wget -c https://...
=> 打开断点续传<br>比如:下载到一半,由于网络因素等原因断开了连接(手动用ctrl + c
来模拟),等问题排除后再一次运行相同的命令,下载不会从0%
开始,而是继续从中断的位置往后下载wget -b https://...
=> 后台下载<br>tail -f wget-log
=> 查看下载进度远程拷贝文件
scp username@IP_Address:~/file ~
=> 从远程服务器指定用户的家目录下的file
文件,下载到本地的家目录下scp -r username@IP_Address:~/dir ~
=> 从远程服务器指定用户的家目录下的dir
目录及其下的所有文件,下载到本地的家目录下scp ~/file username@IP_Address:~
=> 从本地上传file
文件到远程服务器指定用户的家目录下scp -r ~/dir username@IP_Address:~
=> 从本地上传dir
目录及其下的所有文件到远程服务器指定用户的家目录下scp -P 2222 ......
=> 使用指定端口号2222
进行传输scp -p ......
=> 保留文件的最后修改时间及访问时间数据传输工具
-o
=> 指定新的本地文件名-O
=> 保留远程文件的原始名-u
=> 通过服务端配置的用户名和密码授权访问-I
=> 打印HTTP
响应头信息-A
=> 设置用户代理标头信息-b
=> 设置用户cookie
信息-C
=> 支持断点续传-s
=> 静默模式,不输出任何信息-T
=> 上传文件curl www.baidu.com
=> 获取指定网站的网页源码curl -o baidu.html www.baidu.com
=> 保存网页curl -O https://...
=> 下载指定网站中的文件curl -o test.zip https://...
=> 下载并重命名为test.zip
curl -C - -O https://...
=> 断点续传curl -I https://...
=> 打印指定网站的HTTP
响应头文件curl -u user:passwd ftp://...
=> 通过ftp
下载指定文件服务器中的文件curl -T file -u user:passwd ftp://...
=> 将本地的file
文件通过ftp
上传到指定的文件服务器中的指定目录下域名查询,测试域名系统工作是否正常
host www.baidu.com
=> 查询域名对应的IP
地址host -v www.baidu.com
=> 显示执行域名查询的详细信息host -a www.baidu.com
=> 显示详细的DNS
信息监听网络流量,能够记录所有经过服务器的数据包的信息,运行该命令需要管理员权限
tcpdump
=> 监视第一个网络接口上所有流过的数据包tcpdump -i eth0
=> 监视指定网络接口的数据包<br>通过ifconfig
来查看当前系统下有哪些网络接口tcpdump -c 20
=> 显示指定数量的包tcpdump -c 10 -q
=> 以精简模式显示指定数量的包tcpdump host <Hostname>
=> 监视指定主机的数据包(主机名)tcpdump host <IP Address>
=> 监视指定主机的数据包(IP
地址)tcpdump -i any port 22 -A
=> 监听指定端口号的数据包,并以文本形式展示设置路由器,支持测试Linux
的TCP
和UDP
端口,也经常被使用于端口的扫描
-v
=> 显示执行过程-w<超时秒数>
=> 设置等待连线的时间-z
=> 使用0输入/输出模式,只在扫描通信端口使使用-n
=> 直接使用IP
地址,而不通过域名服务器-u
=> 使用UDP
传输协议-l
=> 使用监听模式,管控传入的资料nc -v -z -w2 <IP Adress> 1-100
=> 扫描指定IP
的TCP
端口,范围为1-100
nc -u -z -w2 <IP Adress> 1-100
=> 扫描指定IP
的UDP
端口,范围为1-100
nc -nvv <IP Adress> <port>
=> 扫描指定端口nc -l <port>
=> 监听某个端口nc <IP Adress> <port>
=> 连接某个端口创建并设置账户信息
-d<登入目录>
=> 指定用户登入时的目录-g<群组>
=> 初始群组-G<群组>
=> 非初始群组-m
=> 自动创建用户的家目录-M
=> 不要创建用户的家目录-N
=> 不要创建以用户名为名的群组-s
=> 指定用户登入后所使用的Shell
/etc/passwd
=> 记录用户的信息<br>记录的格式:<username>:<password>:<userID>:<groupID>:<注释信息>:<家目录>:<shell>
,其中,password
是隐藏的,用x
代替显示/etc/shadow
=> 每个用户经过加密后的密码,如果没设置密码用!
表示/etc/group
=> 组信息/etc/gshadow
=> 组对应的密码信息,一般不对其设置,除非需要很高的安全性useradd user1
=> 直接创建新用户,用户名为user1
useradd -m -s /bin/bash user2
=> 常用创建方式useradd -m -d /new/dir user3
=> 指定家目录useradd -u 1500 user4
=> 指定用户ID
useradd -g <group> user5
=> 指定组ID
useradd -g <group> -G <group1,group2> user6
=> 分配多个组useradd -c "Test User Account" user7
=> 自定义注释创建用户账户,与useradd
不同的是,adduser
是一个人机交互的过程,会一步步引导你输入对应的信息,而useradd
如果不自己手动添加参数或后续设置,将创建一个三无账户
adduser
=> 根据交互内容,一步步输入信息以创建账户
修改用户的密码
-d
=> 删除已有密码-l
=> 锁定密码,不允许修改-u
=> 解除锁定,允许修改-e
=> 下次登录强制修改密码-k
=> 用户在期满后仍能使用-S
=> 查询密码状态passwd
=> 修改当前用户的密码passwd username
=> 修改指定用户的密码(需要有管理员权限,同时还得知道该用户当前的密码)删除用户账户
userdel username
=> 删除指定的用户账户信息userdel -r username
=> 删除指定的用户账户信息、家目录及其目录下所有文件切换用户身份
su
or su root
=> 切换超级用户(某些系统不允许你切换超级用户)su -c whoami username
=> 变更账号为username
,在执行完whoami
这一条命令后立即退出su username
=> 变更账号为username
并保留在当前工作目录su - username
=> 变更账号为username
,同时切换到对应的家目录以系统管理员身份执行指令
/etc/sudoers
查看配置文件:<br>sudo visudo
<br>or<br>sudo vim /etc/sudoers
sudo -l
=> 列出当前用户的权限sudo -u username whoami
=> 指定以username
这一身份去执行whoami
这一条命令,默认情况下不加-u
则是以管理员身份执行sudo !!
=> 以管理员权限执行上一条命令显示用户ID
和组ID
id
=> 显示当前用户的所有信息
id username
=> 显示指定用户信息
id -g username
=> 显示指定用户所属组群的ID
id -G username
=> 显示指定用户所属附加组群的ID
参数后不加用户名,则默认显示当前用户的信息
修改用户账户信息
-c <备注>
=> 修改用户账户的备注文字-d <登入目录>
=> 修改用户登录时的家目录-e <有效期限>
=> 修改账号的有效期限-f <缓冲天数>
=> 修改在密码过期后多少天即关闭该账号-g <群组>
=> 修改用户所属的群组-G <群组>
=> 修改用户所属的附加群组-l <账号名称>
=> 修改用户账号名称-L
=> 锁定用户密码,使密码无效-s <Shell>
=> 修改用户登录后所使用的Shell
-u <uid>
=> 修改用户ID
-U
=> 解除密码锁定usermod -d /home/hometest username
=> 将账户username
的家目录更改为/home/hometest
usermod -u 1234 username
=> 将账户username
的ID
更改为1234
usermod -l newname oldname
=> 将账户oldname
更名为newname
usermod -L username
=> 锁定账户username
usermod -U username
=> 解锁账户username
显示用户加入的所有的用户组
groups username
=> 显示用户username
加入的所有的用户组
创建新的用户组
groupadd work
=> 创建一个名为work
的用户组
groupadd -g 1234 work
=> 创建一个名为work
,用户组组ID
为1234
的用户组
groupadd -r grouptest
=> 创建一个新的用户组,并将其设定为系统工作组
系统工作组GID
定义在文件/etc/login.defs
,字段是SYS_GID_MIN
和SYS_GID_MAX
,前者默认100
,后者默认999
,可自行修改
删除用户组
groupdel groupname
=> 将用户组groupname
删除
打印当前登录的用户
whoami
=> 查询当前登录的用户名
查看当前登录至系统的所有用户的信息
一个终端登入就算一个,所以查询得到的结果可能包含多个相同用户
who
=> 查看当前登录至系统的用户信息who -H
=> 查看当前登录至系统的用户信息,并加上标题栏who -H -a
=> 查看当前登录至系统的全部用户信息who -b
=> 查看系统的最近启动时间who -T -H
=> 显示终端属性who -q
=> 以精简模式显示显示已登入系统的用户列表,同时显示用户正在执行的命令
w
=> 显示目前登入系统的用户列表w -h
=> 不打印标题栏w -f
=> 显示/不显示用户从哪登录w -s
=> 使用短格式输出显示用户或终端的登录情况,可以看出谁曾经或企图登录系统
-R
=> 省略hostname
的栏位-a
=> 把从何处登入系统的主机名或IP
地址显示在最后一行-n <显示行数>
or -<显示行数>
=> 指定显示个数-i
=> 显示IP
地址而不是主机名last
=> 显示近期用户或终端的登录情况last -n 5 -R
or last -5 -R
=> 简略显示,并指定显示个数last -n 5 -a -i
=> 最后一列显示主机IP
地址显示当前登录至系统的用户
一个终端登入就算一个,所以查询得到的结果可能包含多个相同用户
users
=> 显示当前登录至系统的用户
实时显示动态进程
-d
=> 指定每两次屏幕信息刷新之间的时间间隔(单位为秒)-c
=> 切换显示命令名称和完整命令行-p
=> 通过指定监控进程ID
来仅仅监控某个进程的状态-n
=> 信息更新最大次数c
=> 显示进程绝对路径P
=> 根据CPU
使用率排行M
=> 根据物理内存使用率排行1
=> 显示每个核的CPU
状况top
=> 实时显示进程动态top -c
=> 显示完整的进程信息<br>与直接top
打开后按快捷键c
等效top -d 5
=> 指定信息刷新时间间隔为5秒top -p 1877
=> 仅监控进程ID
为1877的进程动态top -n 2
=> 设置信息刷新次数显示进程状态
-A
=> 显示所有进程-a
=> 显示所有终端机下执行的程序-x
=> 通常与-a
一起使用,可以列出较为完整的信息-e
=> 列出程序时,显示每个程序所使用的环境变量-f
=> 用ASCII
字符显示树状结构,表达程序间的相互关系-u <用户识别码>
=> 列出属于该用户的程序的状况,也可以使用用户名称来指定USER
=> 用户名称PID
=> 进程号%CPU
=> 该进程所占用的CPU
百分比%MEM
=> 该进程所占用的内存百分比VSZ
=> 该进程所占用的虚拟内存大小RSS
=> 进程所占用的实际内存大小TTY
=> 该进程运行在哪个终端上,若与终端无关,则显示STAT
=> 进程状态:R
=> 运行S
=> 可中断睡眠D
=> 不可中断睡眠T
=> 停止Z
=> 僵死START
=> 进程启动时间TIME
=> 进程实际占用CPU
的时间COMMAND
=> 该进程对应的执行程序ps -aux
=> 列出目前所有的正在内存当中的程序<br>内容较多不方便查看的话可以通过管道给less
打开:ps -aux | less
ps -A
=> 显示所有进程信息ps -ef
=> 显示所有进程信息,连同命令行ps -axf
=> 树形显示所有进程ps -aux | grep ssh
=> 查找特定进程信息ps -u username
=> 显示指定用户信息ps -aux | sort -rnk 3
=> 依据处理器使用量(第三列)的情况降序排序以树状图显示进程
pstree
=> 以树状图显示进程pstree -a
=> 显示该进程的完整指令及参数,遇到相同的进程名可以压缩显示pstree -p
=> 显示当前所有进程的进程号和进程ID
pstree -u
=> 同时显示用户名检索当前正在运行的进程
-d
=> 设置一个字符串,用于分隔输出的每个进程ID
-f
=> 匹配进程名(绝对路径)-l
=> 列出进程名及其进程ID
-u
=> 选择仅匹配指定有效用户进程-a
=> 显示更多内容pgrep sshd
=> 查找sshd
进程的pid
pgrep sshd -d' '
=> 指定分隔符输出<br>此时显示为一行,每个pid
之间用空格隔开pgrep -u username sshd
=> 查询用户username
启动的sshd
进程的pid
pgrep -l sshd
=> 显示进程名及pid
pgrep '^sshd$' -l
=> 使用正则表达式pgrep -f ssh
=> 匹配进程名(绝对路径中是否包含某字符串)查看进程打开的文件
-a
=> 列出打开文件存在的进程-c <进程名>
=> 列出指定进程打开的文件-g
=> 列出GID
号进程详情-d <文件号>
=> 列出占用该文件号的进程+d <目录>
=> 列出目录下被打开的文件+D <目录>
=> 递归列出目录下被打开的文件-n <目录>
=> 列出使用NFS
的文件-i <条件>
=> 列出符合条件的进程-p <进程号>
=> 列出指定进程号打开的文件-u
=> 列出UID
号进程详情lsof
=> 查看当前系统中全部文件与进程之间的对应信息<br>若查询结果出现unknown
,说明这一条信息需要管理员权限lsof +d /home
=> 显示指定目录中被调用的文件信息lsof +D /home
=> 递归显示指定目录中全部被调用的文件信息lsof /bin/bash
=> 查看谁正在使用某个文件(查找某个文件相关的进程)lsof -u username
=> 列出某个用户打开的文件信息lsof -c bash
=> 列出某个进程所打开的文件信息lsof -p 1930
=> 通过某个进程号显示该进程打开的文件lsof -d 1
=> 根据文件描述列出对应的文件信息终端任务调度
jobs -l
=> 列出当前Shell
的任务fg 2
=> 将2号任务调到前台运行ctrl + z
=> 将当前进程切到后台,但状态会停止Stopped
bg 2
=> 恢复2号任务在后台运行(可以唤醒Stopped
为Running
)kill %3
=> 杀死3号任务,状态更改为Terminated
<br>直接kill 3
会报错,因为这代表另外的含义,具体可见下一节内容<br>上述命令中的fg/bg
后接的编号前也可以加%
发送信号到进程
HUP 1
=> 终端断线INT 2
=> 中断,同ctrl + c
QUIT 3
=> 退出,同ctrl + \
TERM 15
=> 终止KILL 9
=> 强制终止CONT 18
=> 继续,与STOP
相反STOP 19
=> 暂停,同ctrl + z
kill -l
=> 列出系统支持的所有信号kill 1951
=> 不指定信号,通过进程号来终止某一个进程,等同于发送终止信号<br>有的进程可能会忽略这个信号从而不终止,此时需要发送强制终止:kill -9 1951
kill -l KILL
=> 查看KILL
这个信号对应的数值kill -9 $(ps -ef | grep username)
=> 杀死指定用户username
的所有进程杀死一个或一组命令
killall sleep
=> 杀死所有名为sleep
的进程killall -l
=> 查看killall
支持的所有信号killall -9 sleep
=> 发送指定信号killall -u username
=> 杀死指定用户的所有进程调整进程的优先级
ps -l
=> 查看nice
值,即标题为NI
的列nice -n 15 vim &
or nice -15 vim &
=> 启动vim
命令在后台运行,同时将它的nice
值设为15<br>nice
值可设置范围在-20 ~ 19
<br>注意:-n 15
是直接设置为15
,而-15
是在原值的基础上增加15
renice 6 -p 5200
=> 根据pid
重新设置nice
值为6
renice -5 -u username
=> 根据用户名重新设置nice
值为-5
后台运行程序
./test
<br>在后台运行:./test &
,但是输出的文字还是会占用终端,而且,在关闭终端后该进程也将终止<br>与终端切断关联:nohup ./test &
,同时,输出的内容将会保存到test
程序同级目录下的nohup.out
文件中nohup ./test > file 2>&1 &
=> 将输出重定向到file
文件中<br>其中,2>&1
表示:将标准错误输出重定向到标准输出中,而标准输出又被重定向到了file
文件,所以,该进程产生的所有输出都将被重定向到file
文件<br>但是,运行后立即cat file
将发现没有任何内容,因为它存在一定缓存,需要到一定量才会输出到文件,过一会儿后再查看,会发现里面存在内容包管理器
sudo apt update
=> 列出所有可更新的软件清单sudo apt upgrade
=> 升级所有可更新的软件包sudo apt upgrade vim
=> 单独升级某一个软件包sudo apt install bat
=> 安装软件包sudo apt remove bat
=> 删除软件包sudo apt show bat
=> 打印软件包信息sudo apt autoremove
=> 清理不再使用的依赖和库文件sudo apt list --installed
=> 列出已安装的所有软件包包管理器
apt
异同点最初,包管理器被分散在apt-get, apt-cache, apt-config
这三个命令中,而apt
包管理则是为了解决命令过于分散的问题,它相当于是这三个中最常用命令选项的集合
apt
视觉功能更好
apt
替换了部分apt-get
系列命令,同时也有它独有的新增的命令
建议尽快适应并首选apt
设置或显示环境变量
环境变量指:在操作系统当中,用来指定操作系统运行的环境的一些参数,例如:PATH
,它用来保存可以搜索的目录、路径,可以通过echo $PATH
查看
-f
=> 代表<变量名称>
中为函数名称-n
=> 删除指定的变量<br>实际上未被删除,只是不会输出到后续指令的执行环境中-p
=> 列出所有的Shell
赋予程序的环境变量export
的作用效果仅限于本次登录/etc/profile
=> 所有用户~/.bashrc
=> 当前用户export -p
=> 列出当前所有的环境变量export MYENV
=> 定义环境变量export MYENV=666
=> 定义环境变量并赋值export PATH=$PATH:/usr/local/mysql/bin
=> 修改环境变量echo $PATH
=> 查看环境变量在当前Shell
环境中从指定文件读取和执行命令,例如:在修改配置文件后,将其source
一下,就能使其生效,而不是重启
可以使用.
来替代
source ~/.bashrc
or . ~/.bashrc
=> 读取和执行.bashrc
文件source /etc/profile
=> 执行刚修改的初始化文件,使之立即生效设置/删除Shell
变量
set
=> 显示所有的Shell
变量declare myenv="666"
=> 定义一个新的变量set -a myenv
=> 将定义的变量输出到环境变量env | grep myenv
=> 查看是否设置成功unset -v myenv
=> 删除环境变量<br>注意:参数-v
表示仅删除变量,参数-f
表示仅删除函数unset myenv
=> 优先删除变量在终端输出字符串
-n
=> 不输出结尾的换行符-e "\a"
=> 发出警告音-e "\b"
=> 删除前面一个字符-e "\c"
=> 结尾不加换行符,同时,\c
后面的字符不会输出-e "\f"
=> 换行,光标仍停留在原来的坐标位置-e "\n"
=> 换行,光标移到行首-e "\r"
=> 光标移到行首,但不会换行,会覆写行开头的字符-E
=> 禁止反斜杠转译,与-e
参数功能相反echo "Hello World"
or echo Hello World
=> 在终端输出Hello World
echo $PATH
=> 输出变量提取后的值
echo \$PATH
=> 取消转译
echo "Hello echo" > file
=> 重定向输出
echo `date`
# 显示命令执行结果
echo -e "a\nb\nc"
=> 输出带有换行符的内容(开启转译)
格式化并输出结果
\a
=> 警告字符,通常为ASCII
的BEL
字符\b
=> 后退\c
=> 不显示输出结果中任何结尾的换行符,而且任何留在参数里的字符,任何接下来的参数以及任何留在格式字符串中的字符都被忽略\f
=> 换页\n
=> 换行\r
=> 回车\t
=> 水平制表符\v
=> 垂直制表符\\
=> 反斜杠字符%c
=> ASCII
字符,显示相对应参数的第一个字符%d %i
=> 十进制整数%E
=> 浮点格式%e
=> 浮点格式%g
=> %e
和%f
之间转换,看哪一个较短,则删除结尾的零%G
=> %E
和%f
之间转换,看哪一个较短,则删除结尾的零%s
=> 字符串%u
=> 不带正负号的十进制整数%x
=> 不带正负号的十六进制,使用a ~ f
来表示10 ~ 15
%%
=> 字面意义的%
%X
=> 不带正负号的十六进制,使用A ~ F
来表示10 ~ 15
printf "%d %s\t%d\n" 666 "Hello printf" 999
=> 常见格式化字符,输出:666 Hello printf 999
printf "%-10s%-8s%-4.2f\n" first second 1.1234
=> 输出:first second 1.12
<br>%10s
=> 该字符串宽度为10
,若字符串长度不足则在字符串前用空格补齐<br>%-10
=> 含义同上,只不过当长度不足时在字符串后用空格补齐<br>%-4.2f
=> 该浮点数的整数部分最多显示四位,小数部分最多显示两位,-
表示左对齐,所以1.1234
格式化后为1.12
清除屏幕
显示并管理历史命令
-c
=> 清空命令记录-d
=> 删除指定序号的命令记录-n
=> 读取命令记录history
=> 显示执行过的全部命令记录history 5
=> 显示执行过的最近5条命令!2039
=> 重新执行2039号命令!!
=> 重新执行上一条命令!ls
=> 将搜索与你输入相匹配的最近一个命令,并重新执行它ctrl + r
=> 调用命令历史记录的递归搜索history -d 1234
=> 删除特定序号的命令history -c
=> 清空全部历史记录登入/登出系统
退出终端/ssh连接
exit
ctrl + d
过滤器
-n
=> 多行输出-d
=> 自定义一个定界符-I
=> 指定一个替换字符串{}
-t
=> 打印xargs
执行的命令-p
=> 执行每一个命令时弹出确认cat file | xargs
=> 多行输入单行输出,将换行符替换为空格cat file | xargs -n3
=> 分成三列进行输出echo "hello:hello:hello" | xargs -d:
=> 通过:
进行分割,输出为hello hello hello
echo "hello:hello:hello" | xargs -d: -p
=> 执行每一个命令时弹出确认ls | xargs -t -I {} echo {}
=> 将ls
结果的每一行都作为参数给echo
命令,用-t
来打印xargs
执行的命令find . -name "*.txt" | xargs -I {} mv {} dir
=> 查找当前文件下的所有后缀为txt
的文件,将它们移动到dir
目录下cat url-list | xargs wget -c
=> 使用wget
下载url-list
下所有的URL
<br>如果添加-I
是一行一行输送,而这里是整体输送调用并执行指定命令
exec -c echo hello world
=> 调用并执行指定的命令,如果是在终端输入,那么在执行完后会退出终端find . -name "*.txt" -exec ls {} \;
=> 结合find
命令使用设置/取消命令别名
alias
=> 查看系统已设置的别名alias "rm=rm -i"
=> 给命令设置别名unalias rm
=> 取消别名显示指定命令的类型
-a
=> 可以显示所有可能的类型,比如有些命令如pwd
是Shell
内建命令,同时也可以是外部命令-p
=> 只返回外部命令的信息,相当于which
命令-f
=> 只返回Shell
函数的信息-t
=> 返回指定类型的信息alias
=> 别名keyword
=> 关键字,Shell
保留字function
=> 函数,Shell
函数builtin
=> 内建命令,Shell
内建命令file
=> 文件,磁盘文件,外部命令unfound
=> 没有找到type -t ls
=> alias
type -t cut
=> file
type -t for
=> keyword
type -t pwd
=> builtin
type -a pwd
=> 显示包含该命令的所有位置显示或设定系统日期和时间
date
=> 以默认格式显示当前时间和日期date +"%Y%m%d %H:%M:%S"
=> 以指定格式显示当前时间和日期date +"current: %D %T %P%thello world"
=> 显示时间的同时加入更多信息date -d yesterday +"%Y%m%d"
=> 显示昨天的日期<br>同理,也可以显示其它日期:next-month, last-year, 7 days...
<br>日期加减操作:"+1 day", "-1 month", "+1 year"
<br>这些设定都需要跟在参数-d
后date --date "12:34:56"
or date -s "12:34:56"
=> 设置日期与时间<br>不过,系统自带时间校准,如果与互联网时间不一致,会自动更新显示日历
cal
or cal -1
=> 显示当前月份日历cal -3
=> 显示近期3个月日历cal 5 2024
=> 显示指定年月的日历cal -y 2024
or cal 2024
=> 显示指定年份的所有日历cal -j
=> 显示自1月1日起到今天的天数定时执行任务(重复)
crontab -e
=> 创建、编辑计划任务crontab -l
=> 查看当前用户的计划任务crontab -r
=> 删除当前用户的计划任务(所有)crontab -e
打开后):* * * * * /bin/ls
=> 每一分钟执行一次/bin/ls
3,15 * * * * /usr/bin/pwd
=> 每个小时的第3和第15分钟执行/usr/bin/pwd
30 0-23/3 * * * echo "Hello"
=> 每天的0-23小时内,每隔3小时的第30分钟执行echo "Hello"
<br>即:0:30, 3:30, 6:30, ...
执行0 */2 * * * /etc/init.d/smb restart
=> 每两个小时重启一次smb
10 1 * * 6,0 /etc/init.d/smb restart
=> 每周六周日的一点十分重启一次smb
50 5 1,15 * * fsck /home
=> 每月1号和15号的5点50分检查/home
磁盘0 22 * * 0 ls
=> 每周日晚上10点执行ls
30 6 */10 * * ls
=> 每月的1、11、21、31号的6点30执行ls
* * * * * command
依次表示分钟、小时、日期、月份、周,最后接上需要重复执行的命令定时执行一次任务
atq
=> 查看系统中的等待作业at -d 1
or atrm 1
=> 删除系统中的编号为1的等待作业at 5 pm
=> 创建一个作业等到5:00pm
时执行,此时将进入交互式界面编写作业内容echo Hello World
......ctrl + d
保存ctrl + c
取消at -f script.sh now
=> 立即执行脚本at -f script.sh now+5 min
=> 5分钟后执行脚本at -f script.sh 17:00
=> 在17:00执行脚本at -f script.sh 11/06/2024
=> 在2024年11月6号的当前时间点执行脚本显示命令执行时所消耗的时间
real
=> 挂钟时间,也就是命令开始执行到结束的时间。这个短时间包括其它进程所占用的时间片和进程被阻塞时所花费的时间user
=> 进程花费在用户模式中的CPU
时间,这是唯一真正用于执行进程所花费的时间,其它进程和花费阻塞状态中的时间没有计算在内sys
=> 花费在内核模式中的时间,代表在内核中执行系统调用所花费的时间,这也是真正由进程使用的CPU
时间time date
=> 显示命令date
的时间统计结果
周期性执行命令
watch uptime
=> 重复执行uptime
命令(默认每2秒一次)watch -n 1 -d uptime
=> 每隔1秒执行一次uptime
,并高亮显示变化的数据watch -d 'ls -l | grep file'
=> 监测当前目录中file
文件的变化watch -n 1 "df -i; df"
=> 监测磁盘inode
和block
数据变化情况数字计算器
bc
=> 进入计算器+-*/
=> 加减乘除^
=> 平方sqrt
=> 平方根scale
=> 设置小数位obase, ibase
=> 进制转换quit
=> 退出echo "scale=2;(3.141-1.717)/1" | bc
=> 设置小数位计算结果<br>注意:这里必须小括号再除以一才能生效echo "obase=10;ibase=2;110101" | bc
=> 二进制转十进制 为文件创建快捷方式
软链接:相当于Windows
系统中的快捷方式,原始文件被移动或删除后,软链接的文件就无法使用
硬链接:将文件的inode
属性块进行复制,将原始文件移动或删除后,硬链接文件依旧可以使用
ln file hfile
=> 创建硬链接ln -s file sfile
=> 创建软链接关闭/重启服务器
shutdown -h now
halt
halt -f
(强制关机或重启)poweroff
shutdown -r now
reboot
reboot -w
(模拟重启过程,将过程写入到日志中)shutdown -h 21:00
=> 晚上11点关机shutdown +5 "System will shutdown after 5 minutes"
=> 5分钟后关机,并且通知所有人shutdown -c
=> 取消所有关机任务如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!