linux常用命令

警告
本文最后更新于 2023-07-05,文中内容可能已过时,请谨慎使用。
/images/all/linux_fiolder.jpg
图片来自菜鸟教程
注意
本文所有内容都基于ubuntu20.04发行版,不同发行版可能略有不同

下面介绍一些常用的目录

  • /: 根目录
  • ~: 用户对应的家目录,root用户对应于/root,user用户对应于/home/user
  • /root: root用户家目录
  • /home: 普通用户主目录,存储各个用户的家目录,每个用户在该文件夹中有一个同名的目录
  • /etc: 这个目录用来存放所有的系统管理所需要的配置文件和子目录
  • /sbin: Superuser Binaries的简写,保存着root用户使用的系统管理程序
  • /tmp: 系统存储临时文件的位置,所有用户都可以访问和写入
  • /opt: 安装第三方软件存放的目录
  • /usr: unix shared resources,保存各种共享文件和数据,以前还包含用户的家目录,现在被/home代替,
    • /usr/local: 手工安装的软件保存位置, 我们一般建议源码包软件安装在这个位置
    • /usr/bin: 系统用户使用的应用程序,如lscatgcc等命令
    • /usr/sbin: 超级用户使用的比较高级的管理程序和系统守护程序,如rebootshutdown命令
  • /var:用于存储动态数据,例如缓存、日志文件、软件运行过程中产生的文件等
    • /var/log: 保存各种日志文件
    • /var/wwwRPM包安装的Apache的网页主目录
注意
关于各文件夹的详细介绍请点此
  • . :当前路径
  • ..: 父级目录
    • ./../../: 上上级目录
  • 命令必须在行提示符之后输入
  • 命令格式:命令 参数名 参数值
  • Ctrl + C:撤销命名的执行
  • 命令参数
    • -参数:单词缩写
    • --参数:单词的全拼
    • []参数:可选参数
    • ... 参数:加入的内容个数是任意的
(1) ctrl c: 取消命令,并且换行
(2) ctrl u: 清空本行命令
(3) tab键:可以补全命令和文件名,如果补全不了快速按两下tab键,可以显示备选选项
(4) ls: 列出当前目录下所有文件,蓝色的是文件夹,白色的是普通文件,绿色的是可执行文件
	-a: 显示所有文件及目录(包括隐藏文件和文件夹)
	-l: 显示更多内容,包括权限、拥有者、文件大小等
(5) pwd: 显示当前路径
(6) cd XXX: 进入XXX目录下, cd .. 返回上层目录, cd ../../ 返回上上层目录
(7) cp XXX YYY: 将XXX文件复制成YYY,XXX和YYY可以是一个路径
	cp -r XXX YYY: 复制XXX文件夹的内容到YYY文件夹中
(8) mkdir XXX: 创建目录XXX
	mkdir 'xxx xxx': 创建名字中间带空格的目录
	-p: 当路径中某些目录不存在时会自动创建
(9) rm XXX: 删除普通文件
	rm XXX -r: 删除文件夹
	rm -rf XXX: 强制删除该文件夹及其子文件夹、隐藏文件夹中的文件(慎用)
(10) mv XXX YYY: 将XXX文件移动到YYY,和cp命令一样,XXX和YYY可以是一个路径;当YYY不存在时相当于重命名
(11) touch XXX: 创建一个文件
(12) 复制文本
    windows/Linux下:Ctrl + insert
(13) 粘贴文本
    windows/Linux下:Shift + insert
# 压缩为.tar.gz
# 压缩指定文件夹
tar zcvf test.tar.gz ~/files/
# 压缩当前文件夹中的文件
tar zcvf test.tar.gz *

# 解压.tar.gz
tar zxvf test.tar.gz

# 查看压缩包中的文件
tar -tf test.tar.gz

# 压缩为test.tar.xz
# 1.压缩为tar文件
tar cvf test.tar ./files
# 2.压缩为.tar.xz文件
xz -z test.tar

# 解压.tar.xz文件
# 1.先解压.xz
xz -d test.tar.xz
# 2.再解压.tar
tar -xvf test.tar

# 压缩为.zip
# 压缩指定文件夹
zip -p -r test.zip ./files
# 压缩当前文件夹中的文件
zip -p -r test.zip *

# 解压zip
unzip test.zip

# 如果先要在.tar.gz中追加文件,必须按下面这么压缩
tar -cvf test.tar.gz  a.txt
# 追加文件b.txt
tar -cvf test.tar.gz  b.txt

文件描述符:

  • 0 — stdin(标准输入)
  • 1 — stdout(标准输出)
  • 2 — stderr(标准错误)

输出重定向操作符有>>>两种,这两个操作符都可以将重定向到文件,但是前者会先清空文件,再写入内容;后者会将内容追加到现有文件的尾部。

注意: 重定义操作符前无数字时等价于有数字1的情况

echo "test" > test.txt # 如果test.txt有内容会先清空再写入

echo "test" >> test.txt # 追加内容到test.txt中

ls a.c 1> stdout.txt # 标准输出重定向到stdout.txt文件中
ls aaa.c 2> stderr.txt # 标准错误重定向到stdout.txt文件中

# /dev/null是linux的一种特殊文件,重定向操作给这个文件的所有东西都会被丢弃
ls aaa.c 2> /dev/null # 忽略标准错误输出

# command >file n>&m 以覆盖的方式,把文件描述符为n与文件描述符为m的输出合并到file文件中

./output.sh >application.log 2>&1 # 把错误输出合并到标准输出中再重定向到application.log的文件中

./output.sh >application.log 2>application # 和上面的命令的区别是stdout和stderr都直接送到file中, file会被打开两次,这样stdout和stderr会互相覆盖,这样写相当使用了FD1和FD2两个同时去抢占file的管道,io效率更低
命令 说明
command < file file文件中的内容作为command的输入
command << END 从标准输入(键盘)中读取数据,直到遇见分界符END才停止

例1:利用标准输入作为wc命令的输入来统计键盘输入的行数,单词数,字节数

wc << EOF
123456
hello world
welcome
my blog
EOF

输出 4 6 35, 代表4行,6个单词,35个字节

例2: 将用户的输入直接写入文件中

cat << EOF > new.txt
111
222
333
EOF

可以看到new.txt中内容为111 222 333.

linux除了有上面的输入输出重定向,还有一种功能,就是可以将两个或者多个命令(程序或者进程)连接到一起,把一个命令的输出作为下一个命令的输入,以这种方式连接的两个或者多个命令就形成了管道(pipeline)

Linux 管道使用竖线|连接多个命令,这被称为管道符

command1 | command2
command1 | command2 [|commandN...]

当在两个命令之间设置管道时,管道符|左边命令的输出就变成了右边命令的输入。只要第一个命令向标准输出写入,而第二个命令是从标准输入读取,那么这两个命令就可以形成一个管道,这里需要注意,command2 必须可以处理command1的输出结果。

管道也是一种文件,管道中的读数据是一次性操作,数据一旦被读,它就从管道中被抛弃。

例: 按照文件大小降序排序输出

ls -l | sort -nrk5

后台运行spring项目,并输出日志到当前文件夹中的hello.log文件

nohup java -jar spring.jar &> hello.log &

使用kill可以关闭后台运行的项目

/images/all/demo_1.png

jobs命令用于查询当前shell环境中已启动的作业状态

  1. command &:后台执行command
  2. fg %n : 让后台运行的进程n到前台来
  3. bg %n: 让进程n到后台去
  4. kill %n: 关闭对应进程

njobs查看到的进程编号

/images/all/demo_2.png

jobs -l可以查询出对应进程的PID, 使用kill -9 PID可以杀死该进程

/images/all/demo_3.png

默认使用Makefile中的规则构建

也可以指定构建自定义规则文件

make -f rules.txt

构建

sudo make clean # 清除上次构建的目标文件
sudo make # 重新构建

查看文件内容:

cat ~/.ssh/id_rsa.pub

清空1.txt内容:

cat /dev/null > 1.txt

1.txt的内容写入2.txt

cat 1.txt > 2.txt

1.txt的内容追加写入 2.txt

cat 1.txt >> 2.txt

1.txt2.txt追加写入3.txt

cat 1.txt 2.txt >> 3.txt

对于一个文件来说,用户可以分为三类:

  • 文件的拥有者 - user
  • 文件的拥有者所在用户组 的其他成员 - group
  • 拥有者用户组 成员以外的其他用户 - others

linux的文件操作权限包括读、写、可执行,对应字母为r、w、x

/images/all/file_permission.png
一图了解linux文件权限
# 第一种方式:+、-、=变更权限
# u:所有者    g:用户组    o:其他人    a:所有人(u、g、o总和)
chmod u=rwx,g=rx file         # 表示该文件者拥有读、写、执行权限,同一用户组拥有读、执行权限,其他人未设置拥有之前的权限
chmod g+w file                # 表示该文件在原权限上添加同一用户组可写权限
chmod a-x file                # 表示该文件在原权限上取消所有人的执行权限
chmod +x file                 # 表示该文件同时给所有人加上可执行权限
# 第二种方式:通过数字变更权限
# r=4    w=2    x=1    -=0    如:rwx=4+2+1=7
chmod 755 file                # 相当于chmod u=rwx,g=rx,o=rx file

将文件或文件夹的拥有者改为指定的用户或组(或者同时修改)

一般情况下只有该文件的拥有者或者所属组的用户才能进行编辑(除非你设置了所有人可以编辑)

chmod owner:group a.txt # 修改某个文件
chown -R owner:group /var/www/blog/ # 将/var/www/blog/文件夹下的所有者修改为group下的owner用户所有

更改文件所在组

# 修改文件所属用户组
chgrp [-R] 用户组名称 文件或目录

文本搜索命令:查找文件中符合条件的字符串

语法: grep [模式] [选项] [文件]

模式支持正则匹配

常见选项

选项 作用
-i 忽略字母大小写
-v 输出不匹配行
-n 输出匹配结果的行号
-A numA-B numB 输出匹配结果的后numA行和前numB
-r 递归搜索某个文件夹中文件是否包含目标字符串
-l 显示包含目标字符串的文件名称
-E 使用拓展正则表达式
-G 使用基本正则表达式
-P 使用Perl正则表达式
-o 只查看匹配结果
ps -ef | grep sshd # 查询ssh进程
grep '^h' -i -n a.txt  # 输出以h开头的行(不区分大小写)
grep '[0-9]$' -n a.txt  # 输出以数字结尾的行
grep 'he' -i -h a.txt # 搜索字符串"he"所在行
grep '[0-9]$' -v a.txt # 输出非数字结尾的行
ls -l | grep *.cpp # 查询当前文件夹是否存在.cpp后缀文件
ls -l | egrep '*.c$' # 查询当前文件夹是否存在.c后缀文件

删除某个用户及其家目录前需要先要杀掉该用户的所有进程并切换到其他用户

sudo userdel -r username

全称为word count, 主要用于计算文件的字节数、单词数、行数

wc -c filename # 统计文件的字节数
wc -w filename # 统计文件的单词数
wc -l filename # 统计文件的行数

查看命令的帮助文档,如man ls

  • G: 跳到末尾
  • g: 跳到开头
  • y:上一行
  • 回车: 下一行
  • 空格: 下一页
  • b: 上一页
  • q:退出

netstat命令用于显示各种网络相关信息,如网络连接,路由表,接口状态 (Interface Statistics),masquerade 连接,多播成员 (Multicast Memberships) 等等。

常用参数

-a (all)显示所有选项,默认不显示LISTEN相关
-t (tcp)仅显示tcp相关选项
-u (udp)仅显示udp相关选项
-n 拒绝显示别名,能显示数字的全部转化成数字。
-l 仅列出有在 Listen (监听) 的服务状态
-p 显示建立相关链接的程序名
-r 显示路由信息,路由表
-e 显示扩展信息,例如uid等
-s 按各个协议进行统计
-c 每隔一个固定时间,执行该netstat命令。

例如:

netstat -ntlp
/images/all/image-20230316155337730.png

cron是一个linux下的定时执行工具,可以在无需人工干预的情况下运行作业。由于cronlinux的内置服务,但它不自动起来,可以用以下的方法启动、关闭这个服务。

cron服务提供crontab命令来设定cron服务的,以下是这个命令的一些参数与说明:

  • crontab -u //设定某个用户的cron服务;
  • crontab -l //列出某个用户cron服务的详细内容;
  • crontab -r//删除某个用户的cron服务;
  • crontab -e //编辑某个用户的cron服务。
0    2    *    *    6
*    *    *    *    * 
-    -    -    -    - 
|    |    |    |    |    
|    |    |    |    |    
|    |    |    |    +----- 星期几 (0 - 6) (Sunday=0) OR sun,mon,tue,wed,thu,fri,sat
|    |    |    +---------- 月份 (1 - 12) OR jan,feb,mar,apr ...
|    |    +--------------- 几号 (1 - 31)
|    +-------------------- 小时 (0 - 23)
+------------------------- 分钟 (0 - 59)

特殊字符解释:

字符 含义 示例
* 表示匹配域的任意值 在分这个域使用 *,即表示每分钟都会触发事件。
- 表示起止范围 在分这个域使用 5-20,表示从5分到20分钟每分钟触发一次。
/ 表示起始时间开始触发,然后每隔固定时间触发一次 在分这个域使用 5/20,表示在第5分钟触发一次,之后每20分钟触发一次,即 5、 25、45 等分别触发一次。超过60后重新刷新
, 表示列出枚举值 在分这个域使用 5,20,则意味着在5和20分每分钟触发一次。

一些例子:

  • 30 16 * * * /usr/local/etc/rc.d/lighttpd restart 表示每晚天中午的16:30重启lighttpd
  • 40 3 3,15,23 * * /usr/local/etc/rc.d/lighttpd restart 表示每月3、15、23日的3 : 40重启lighttpd
  • 30 3 * * 6,0 /usr/local/etc/rc.d/lighttpd restart 表示每周六、周日的3 : 30重启lighttpd
  • 0,30 20-22 * * * /usr/local/etc/rc.d/lighttpd restart 表示在每天20 : 00至22 : 00之间每隔30分钟重启lighttpd
  • 0 23 * * 6 /usr/local/etc/rc.d/lighttpd restart 表示每星期六的11 : 00 pm重启lighttpd
  • 0 */2 * * * /usr/local/etc/rc.d/lighttpd restart 每2小时重启lighttpd
  • * 23-7/1 * * * /usr/local/etc/rc.d/lighttpd restart 晚上11点到早上7点之间,每隔一小时重启lighttpd
  • 0 11 5 * mon-wed /usr/local/etc/rc.d/lighttpd restart 每月的5号与每周一到周三的11点重启lighttpd
  • 0 5 1 jan * /usr/local/etc/rc.d/lighttpd restart 一月一号的5点重启lighttpd

1.less: 分页查看文件内容

  • G: 跳到末尾
  • g: 跳到开头
  • y:上一行
  • 回车: 下一行
  • 空格: 下一页
  • b: 上一页
  • q:退出

2.head: 查看文件的前几行(默认为10行)

  • head -n 5 filename: 查看文件的前5行

3.tail: 查看文件的后几行(默认为10行)

  • tail -n 5 filename: 查看文件的后5行
  • ctrl + a: 光标移动到行首
  • ctrl + e: 光标移动到行尾
  • ctrl + u: 清空本行的命令
  • ctrl + k: 从光标所在位置删除到行尾
  • Ctrl + L :清空屏幕
  • Ctrl + insert:复制
  • Shift + insert : 粘贴
  • ctrl + shift + t: 新开一个shelltab
  • ctrl + shift + n: 新开一个shell窗口

root权限

lsof -i:端口号   # 查看端口占用情况
netstat -tunlp | grep 端口号 # 查看端口占用情况
kill -9 PID # 根据PID杀死进程

1.top:查看所有进程的信息(Linux 的任务管理器)

  • 打开后,输入 M:按使用内存排序

  • 打开后,输入 P:按使用 CPU 排序

  • 打开后,输入 q:退出

2.df -h:查看硬盘使用情况

3.free -h:查看内存使用情况

4.du -sh:查看当前目录占用的硬盘空间

5.ps aux:查看所有进程

6.kill -9 pid:杀死编号为 pid 的进程

7.netstat -nt:查看所有网络连接

8.w:列出当前登陆的用户

sudo shutdown -h 10 # 10分钟后关机
sudo shutdown -h 20:00 # 20:00关机
sudo shutdown -h now # 立即关机
sudo shutdown -r now # 重启
sudo shutdown -c # 取消关机任务
sudo reboot # 重启,和 sudo shutdown -r now 相同作用

无需执行权限

source 文件.sh
sh 文件.sh
bash 文件.sh

区别: sh、bash 都会开启一个子shell,而source将会直接在当前shell中执行,有时候更改了系统环境变量不会立即生效,而需要使用source继续更新一下

在子shell中设置的环境变量父shell是不可见

需要权限

./文件.sh

如果想要在一行中执行多个命令,可以用;进行隔开:

$ echo "aaaa" echo "bbbb"
aaaa echo bbbb
$ shell echo "aaaa";echo "bbbb"
aaaa
bbbb

相关文章