本文介绍了一些Linux的常用命令。为了便于快速检索命令位置,文章二级标题都以“命令:命令的作用”展示,有些命令会先介绍命令的几个常用参数,然后结合具体的操作展示命令的使用。为了便于记忆,也会提到命令是由哪些短语或单词简写而来。本文的主要内容如下:
第一、二章 介绍了用户管理和系统管理常用命令。
第三、四章 简要介绍Linux文件是什么,并且结合相关命令介绍输入输出和文件操作。
第五章 补充了几个命令,比如说查看命令手册的man命令、搜索命令grep命令等。
注:像一些常用的文本编辑和查看命令如vi、vim、more、less等,因为较为复杂,受于篇幅限制就不再详细说明,可以使用man命令查看对应的命令手册或者搜索相关的介绍。同时,为了页面的简洁,此处不再附目录索引,可以使用侧边栏的目录进行导航。
一、用户管理
1. id:显示本用户信息
id [用户名(缺省情况下为当前用户)]
2. adduser:建立新用户
sudo adduser 用户名
# 也可以是以下命令:
sudo useradd 用户名
可以通过以下命令查看刚刚添加的用户:
cat /etc/passwd
3. passwd:为用户设置密码
# 更改当前用户密码
passwd
# 更改其他用户密码(需要有管理员权限)
passwd 用户名
注释:echo $?是输出上一命令返回值,0表示上一命令正常结束
注意:为了安全,设置密码的时候,所有的输入都不会在屏幕上输出。
4. su:切换用户
su 是switch user 的简写
# 切换到某用户的命令如下
su 用户名
5. sudo:以其他身份执行命令
sudo意为switch user do,sudo默认使用root的身份执行命令
sudo 命令
# 也可以使用指定的用户身份去执行命令(但是要注意权限问题)
sudo -u 用户 命令
6. userdel:删除用户
userdel 是 user delete 的简写
sudo userdel 用户名
# 也可以使用以下命令:
sudo deluser 用户名
7. usermod:修改用户配置
usermod 是 user modefy 的简写
sudo usermod 对应的参数 用户名
8. 组操作
不同的用户组也有类似的操作命令,如groupadd、groupdel、groupmod,分布对应新增组、删除组、修改组设置,类似于用户操作,此处不再一一列举。
二、系统管理
1. uname:显示系统信息
uname -a
2. date:查看/设置 系统的 时间/日期
date
3. w:查看当前登录系统的用户信息
w是who的简写。
w
# 也可以使用who
who
4. last:查看登录信息
last
5. alias:设置命令别名(仅本次登录有效)
# alias命令,相关示例如下
# 列出所有别名设置
alias
# 设置别名
alias 别名="命令"
# 删除别名
unalias 别名
# 如果想要每次登录都生效,需要修改 .bashrc 文件
# 在别名不与系统命令冲突的情况下,还可以对一组命令设置别名
# chp不是系统命令(可用type命令检测该命令是否存在),下面的单引号之间的命令意味:
# 切换到当前用户目录(home),打印出当前工作目录,输出“123!!!”
alias chp='cd ~;pwd;echo "123!!!"'
6. export:显示/设置 系统变量
# 显示环境变量,-p参数表示显示所有变量
export -p
# 设置环境变量
export 变量名称=变量值
# 屏蔽某变量(变量被屏蔽,不会输出到后续命令的执行环境中,但是并未被删除)
export -n 变量名称
7. free:查看内存状态
# 默认是以KB为单位
free
# 以适合人们(human)查看的方式
free -h
# 以Byte为单位查看内存
free -b
# 以KB为单位查看内存
free -k
# 以GB为单位查看内存
free -g
8. df:查看磁盘与文件系统使用状态
df是disk free的简写
df
# 可以使用以下命令查看磁盘大小并输出文件系统类型(Type)
# 参数 -T 表示输出文件系统类型
# 参数 -h 表示human-readable,即以人们易读的方式输出
df -Th
9. top:显示与管理执行中的程序
top
10. ps:查看程序状态
ps是process status的简写
ps
# 输出系统中运行的所有程序信息
# 可以使用man命令来详细查看各个参数的作用
ps -axu
# 若果想要以树状图显示程序状态,还可以使用以下命令
# pstree是process status tree的简写
pstree
11. kill:向指定程序发送信息/结束进程
# 查看所有的编号与信息对应表
kill -l
# 查看指定编号对应信息
kill -l 编号
# 向进程发送指定信号(进程ID可通过ps命令查看)
kill -s 编号 进程ID
# 或者直接写为
kill -编号 进程ID
12. exit:退出当前shell
exit
13. sleep:休眠/暂停执行命令
sleep 时间与单位
#休眠10s,并在休眠结束后输出“end”。 & 表示程序在后台运行
(sleep 10s; echo "end") &
14. shutdown:关机与重启
# 重启
sudo reboot
# 关机
sudo halt -p
# 立即关机
shutdown -h now
# 立即重启
shut down -r now
# 晚上11点关机
shutdown -h 22:00
# 2分钟后关机,并发送给登录的用户警告信息
shutdown +2 "we will shutdown this computer"
# 10秒后关机
shutdown -t 10
15. pwd:显示工作目录
pwd为print working directory 的简写
pwd
16. whereis:查找命令的位置(源代码文件、二进制文件、man手册)
# 首先介绍一下whereis命令的参数
# -b
# 只查找二进制文件
# -m
# 只查找帮助文件
# -s
# 只查找帮助文件
# -l
# 列出查找的路径
# 具体用法
whereis [-参数] 命令
17. which:在环境变量$PATH设定目录中查找符合条件的命令
# which可以在环境变量中查找符合条件的命令(不带参数时返回首个找到的命令路径)
# 有点类似于whereis
# 如果加上参数 -a 可以返回所有找到的命令路径
18. type:查看命令的类型
三、输入输出操作
在介绍输入输出和文件操作之前,有这么一种说法“linux中一切皆文件”,我简单理解为:所有的东西都是按照文件的方式去组织的,对文件的操作也都是通过文件描述符(标识文件的一个整数)来进行的。Linux中的文件可以分为7类:普通文件(文件符号“-”)、目录文件(文件符号“d”,directory)、链接文件(文件符号“l”,link)、块设备(文件符号“b”,block)、字符设备(文件符号“c”,character)、管道文件(文件符号“p”,pipe)、套接字文件(文件符号“s”,socket)。文件的类别可以通过ls命令查看:
在启动一个连接时,程序默认会打开3个I/O文件:标准输入文件(stdin)、标准输出文件(stdout)、标准错误文件(stderr),其文件描述符是分别是0、1、2。
在一条命令的执行过程中,一般是用户从键盘或其他设备通过标准输入文件进行输入,命令执行完毕后,通过标准输出文件输出到设备,如果存在错误则会通过标准错误文件输出到设备。在一般的情况下都是从终端进行输入输出的。
1. 重定向
重定向 可以分为 输入重定向 和 输出重定向 。
输入重定向 是将命令的输入从 标准输入 重定向为 指定的文件 ,可以使用 < 或者 << 重定向标准输入。输入重定向较少使用,因此仅举一个简单的例子:
输出重定向 是将命令的 标准输出 或 标准错误 重定向为 指定的文件,可以使用 >、 >> 、1>、 2>、 1>>、 2>>重定向标准输出与标准错误。
# 输出重定向符 > 的使用
# 如果目标文件不存在,会创建该文件;如果存在,会覆盖原文件内容
# 将标准输入重定向到文件
命令 > 指定文件
# 输出重定向符 >> 的使用
# 如果目标文件不存在,会创建该文件;如果存在,会向原文件中追加内容
# 将标准输入重定向到文件
命令 >> 指定文件
# 输出重定向符 1> 的使用
# 如果目标文件不存在,会创建该文件;如果存在,会覆盖原文件内容
# 将标准输入重定向到文件
命令 1> 指定文件
# 输出重定向符 2> 的使用
# 如果目标文件不存在,会创建该文件;如果存在,会覆盖原文件内容
# 将标准错误重定向到文件
命令 2> 指定文件
可以将标准输出和标准错误分别输出。
也可以将标准输出和标准错误重定向到同一个文件(使用 2>&1 将标准错误重定向到标准输出,再将标准输出重定向到文件)
命令 1> 目标文件 2>&1
# 输出重定向符 1>> 和 2>> 也是向文件中追加内容
命令 1>> 指定文件
命令 2>> 指定文件
# 将标准输出和标准错误分别向不同文件追加
命令 1>> 指定文件1 2>> 指定文件2
# 1>> 和 2>可以混用
命令 1>> 指定文件1 2> 指定文件2
# 1> 和 2>>也可以混用
命令 1> 指定文件1 2>> 指定文件2
# 向同一文件追加标准输出与标准错误的方式与前面一样,使用2>&1将标准错误重定向到标准输出即可
命令 1> 指定文件 2>&1
# Linux提供了一个文件 /dev/null ,输出到这个文件的所有信息都会被丢弃,就像一个很大的垃圾桶
# 如果程序有标准输出或者标准错误输出,可以选择将其重定向到该文件。
2. 管道
管道操作符为 | 。
可以将管道理解为输出输出重定向,即,将前一个命令的标准输出重定向到后一个命令的标准输入。简单地说,就是把前面命令的输出作为后面命令的输入。
比如,希望找到当前进程中,跟root有关的进程,可以使用ps命令查看所有进程,再使用grep命令对其进行筛选。
# 找到当前跟root有关的进程
ps axu | grep root
3. tee:从标准输入读取并输出到标准输出和文件
有时想要既在屏幕终端进行输出,又把输出保存到文件中,这个时候,tee命令就派上用场了。
tee可以从标准输入设备读取输入内容,同时将内容输出到屏幕终端和文件。
# 简要介绍tee的一些参数
# -a
# 默认情况下,如果如果目的文件存在,是会覆盖该文件内容的
# 加上 -a (append的意思)参数,表明将输出信息追加到该文件
4. cat:将文件连接并输出到标准输出设备(常用作查看文件内容)
cat是concatenate(连接)的简写
# cat 默认向屏幕输出文件的内容
cat 文件名
# 输出内容并标出行号
cat -n 文件名
# 连续输出若干文件的内容
cat -n 文件名1 文件名2 文件名3 .....
# 输出若干文件内容,输出目标为另一个文件
# 若目标文件不存在,则创建并输出,若目标文件存在,则覆盖目标文件
cat 文件名1 文件名2 > 目标文件
# 若目标文件不存在,则创建并输出,若目标文件存在,则向目标文件后追加新内容
cat 文件名1 文件名2 > 目标文件
5. \ 输入时换行
有时在命令行输入的内容过长,或者为了便于观察,希望能在输入时换行,这个时候就可以使用 \ 了。
四、文件操作
1. ls:列出目录的内容
ls是list的简写
# 首先介绍一下ls命令的参数
# -a
# 显示所有的文件和目录,包括以 . 开头的文件
# -l
# 每行仅显示一个文件或目录名称,分别显示:
# 权限标识、硬链接数目、拥有者、组名称、文件或目录大小、最后更改时间
# -F
# 分类显示,可执行文件后加* 目录后加/ Socket后加= 符号链接后加@ 管道名称后加|
# -h
# human readable 以便于人查看的方式显示目录大小
# -R
# 递归处理,将子目录名称也一并列出
# -S
# 按照文件和目录的大小排序(-s 以块为单位显示文件或目录的大小)
# -t
# 按照文件的变更时间排序
# -X
# 以文件或目录的扩展名排序
# -r
# 反向排序,用相反的顺序列出文件和目录的名称
# 列出当前路径下的文件和目录
ls
# 列出当前路径下的所有文件和目录
ls -a
# 列出当前路径下的所有文件和目录及其详细信息
ls -al
# 列出指定目录下的文件,以人们易读的方式显示其详细信息,并分类显示
ls -lhF 指定目录
# 递归列出当前目录中的所有内容,包括子文件夹中的内容
ls -lR
# 按照文件的大小排序显示文件夹中的内容
ls -lS
ls -lSr
# 按照最后修改时间,列出当前目录中的文件
ls -lt
ls -ltr
2. cd:切换目录
cd是change directory的简写
# 切换到用户目录
cd
# 切换到用户目录也可以用
cd ~
# 切换到指定目录
cd 指定目录路径
# 切换到的目录含有空格,可以使用引号引起来
cd "指定目录路径"
# 切换到上级目录
cd ../
# 上述命令可简写为
cd ..
3. mkdir:建立目录(文件夹)
mkdir是make directories的简写
# 首先介绍一下ls命令的参数
# -p
# parents,如果要建立的目录上层目录未建立,加上该参数会连同上层目录一起建立
# -m <目录属性>
# 建立目录的时候为目录设置权限
# 在目录下建立子目录
mkdir 目录
# 在当前目录下建立子目录,授予所有成员读写执行权限
mkdir -m <权限> 目录
4. find:查找文件/目录
# 列出某路径下的所有目录和文件(默认为当前文件夹)
find [路径]
# 查找某目录下以te开头的文件/目录
find [路径] -name ‘te*’
# 查找某目录下以t结尾的文件/目录
find [路径] -name ‘*t’
# 可以使用 -o或者-a 连接不同的判断条件(-o: or,满足一个条件即可,-a:and,满足所有条件)
# 查找某目录下以te开头或者以t结尾的文件/目录
find [路径] -name ‘te*’ -o -name ‘*t’
# 查找某路径下形如a??的字符,其中一个“?”代表任意一个字符
find [路径] -name 'a??'
# 查找指定时间内变动过的文件 下面的“+“表示指定时间之前,“-“表示指定时间之后
# 可以加上-ls参数,列出文件/目录的详细信息
find [路径] -mmin [+或-]分钟
find [路径] -mtime [+或-]天数
5. locate:一种高效快速的查找文件方式
locate是使用数据库查找文件的一个命令,具有更高的速度和效率,但是实时性较差(取决于数据库更新的频率)。在最开始的时候,数据库可能并不存在,因此需要使用updatedb命令更新数据库。如果创建文件(删除文件),并且没有更新数据库的情况下,也是找不到对应文件的(查到的路径不存在)。
# 首先介绍一下locate命令的参数
# -i
# ignore-case,忽略大小写
# -e
# existing,查询时会确认文件是否存在,如果存在才输出
6. cp:复制文件/文件夹(目录)
cp为copy的简写
# 将文件1复制为某路径下的文件2
cp 文件1 某路径下的某文件
# 将文件1复制到某文件夹
cp 文件1 某文件夹的目录
# 将某文件夹 复制到另一个文件夹中:
# 如果目的文件夹存在,则将该文件夹复制到对应文件夹中,作为其子文件夹
# 如果目的文件夹不存在,则创建该文件夹,并将该文件夹中的内容复制到新创建的文件夹中
cp -r 文件夹 目的文件夹
7. scp:在网络上不同主机间 安全地复制文件
OpenSSH secure file copy,可以在两台主机之间进行文件的拷贝。它使用ssh进行安全的拷贝,并且需要通过密码验证。
# scp命令的参数有很多,这里只是简要介绍部分
# -P
# 指定端口号,默认为22号端口
# -r
# 递归复制文件夹中的内容
# scp命令的格式为:
scp -P 端口号(默认为22) 源文件 ... 目的文件
# 将本地文件复制到远程主机
scp -P 端口号(默认为22) 本地的文件 远程主机用户名@远程主机IP:路径
比如:scp -P 22 /home/ubuntu/myfiles auser@10.15.65.62:/home/auser/store
# 将远程主机的文件复制到本地只需交换源文件和目的文件的位置即可
scp -P 端口号(默认为22) 远程主机用户名@远程主机IP:路径 本地的文件
比如:scp -P 22 auser@10.15.65.62:/home/auser/store /home/ubuntu/myfiles
在windows的命令行中复制文件和文件夹也是同样的操作:
8. mv:移动或重命名现有目录/文件
mv为move的简写
# 首先介绍一下mv命令的参数
# -f
# force,强行移动或重命名,即目的文件/目录名与现有的文件/目录重复的情况下会强行覆盖原有文件
# -b
# bakup,如果需要覆盖原有文件,则先将源文件备份,备份名称默认加上~后缀
# -S <后缀>
# 配合-b使用,指定备份文件所要附加的后缀
# -v
# 执行时输出相关信息
# 重命名某目录/文件
mv 源目录/文件 目的目录/文件
# 移动重命名
mv 源目录/文件 目的目录/文件
# 将当前目录下的abc移动到dir1下并重命名为a.txt,以默认备份方式备份a.txt
mv -b abc dir1/a.txt
# 将当前目录下的abc移动到dir1下并重命名为a.txt,备份原有的文件(添加.bakup后缀)
mv -b -S .bakup abc dir1/a.txt
9. rm:删除文件或目录
rm为remove的简写
# 首先介绍一下rm命令的参数
# -i
# 删除文件或目录之前询问用户
# -f
# force,强制删除目录或文件
# -r (或者是-R)
# 递归处理,删除指定目录及所有子目录和子文件
# -v
# 执行时输出相关信息
#################### 执行删除操作时,一定要万分谨慎 ####################
# 删除当前文件夹下的某文件
rm 文件名
# 删除某个目录,删除前询问文件是否需要被删除(可进行选择性删除)
rm -ri 目录
# 强制删除某个目录及其子目录和子文件
rm -rf 目录
谨慎使用rm命令!!!
五、其他
1. man:查询命令手册
man为manual 的简写
# 查找某命令的手册,以查看相关操作
man 命令
比如man ls (点击q退出,q的意思的quit)
2. grep:查找文件中符合条件的字符串
grep是Globally search a Regular Expression and Print的简写
grep [参数] 样式 [文件或目录(如果缺省则表示从标准输入设备输入)]
# 首先介绍一些参数的使用
# -A行数
# after,显示对应行之后的若干行
# -B行数
# before,显示对应行之前的若干行
# -d 操作
# 该参数指定了对于目录的处理方式
# 这里的操作是read(当作字符串处理)、recurse(递归处理)、skip(跳过)。
# 默认情况下是read
# -d recurse 也可以写作 -r
# -i
# --ignore-case,表示忽略大小写
# -l
# 只列出符合条件的文件名
# -L
# 列出不符合条件的文件名
# -n
# 列出对应的行号
# -w
# 查找完全符合样式的单词,如,查找int,原本可以被查找到的interesting在加了-w之后不会被查出
# 如果某一字符为任意字符,可以使用.替代
# 比如要查找aaa,aba,aca,ada,......可以使用 a.a 来进行匹配
# 如果要查找带有字符 . 的文件,需要使用 \. 替代,可以查看下面图片示例。
# 在当前目录的所有后缀为.c文件中,查找包含“#include”的所有行,并显示行号
grep -n '#include' *.c
# 在当前目录的所有文件中,查找包含“intf”行及该行之前的1行和之后的2行,并显示行号
grep -n -B1 -A2 'int' *
# 查找某指定路径中的所有文件(包括子目录中的文件),找到含有‘sleep’的文件,只输出文件名
grep -lr 'sleep' 指定路径
# 通过使用管道,可以把前一命令的输出变成后一命令是输入,管道符为 |
# 由此可以从某程序的输出结果中,找到满足某条件的行并输出
# 该方法很适合从大量的输出中筛选出所要的信息
# 比如找到/home/ubuntu/下某一身份用户同时具有读、写、执行权限的文件(包含rwx)
la -al /home/ubuntu/ | grep 'rwx'
# 也可以从某一文件中找到包含int这个单词的行
# 找到某一目录下所有的.c文件,并将其结果保存到result.txt文件中
# 当然,使用之前用过的find命令“find /home/ubuntu/ -name '*.c*'”是完全可以的。
find /home/ubuntu/ | grep '\.c' > result.txt
# 输出当前跟root有关的所有进程信息
ps aux
3. jobs:查看作业状态
test.o为一个每隔一秒输出一个数字的程序,在执行程序时,可以使用Ctrl + Z 暂停程序执行。
3. bg:后台执行程序
bg为background的简写
# 使用bg 工作编号 的格式将任务放到后台执行
bg 作业编号
#因为这个程序是有输出的,所以依然会向屏幕终端输出信息,但是程序确实是在后台执行的。
4. fg:前台执行程序
fg为foreground的简写
# 使用fg 工作编号 的格式将任务放到后台执行
fg 作业编号
如有不当或错误之处,恳请您的指正,谢谢!!!