管道

概念
管道类似于文件重定向,可以将前一个命令的stdout重定向到下一个命令的stdin

要点

  • 管道命令仅处理stdout,会忽略stderr
  • 管道右边的命令必须能接受stdin
  • 多个管道命令可以串联。

与文件重定向的区别

  • 文件重定向左边为命令,右边为文件。
  • 管道左右两边均为命令,左边有stdout,右边有stdin

统计当前目录下所有python文件的总行数

find . -name ‘*.py’ | xargs cat | wc -l


打包压缩

打包/解包

1
2
3
4
# 打包文件
tar -cvf 打包文件.tar 被打包的文件/路径...
# 解包文件
tar -xvf 打包文件.tar

tar选项说明:

选项 含义
c 生成档案文件,创建打包文件
x 解开档案文件
v 列出归档解档的详细过程,显示进度
f 指定档案文件名称,f 后面一定是 .tar 文件,所以必须放选项最后

注意f 选项必须放在最后,其他选项顺序可以随意

压缩/解压缩
1)gzip
tar 与 gzip 命令结合可以使用实现文件 打包和压缩
tar 只负责打包文件,但不压缩
用 gzip 压缩 tar 打包后的文件,其扩展名一般用 xxx.tar.gz
在 Linux 中,最常见的压缩文件格式就是 xxx.tar.gz

在 tar 命令中有一个选项 -z 可以调用 gzip ,从而可以方便的实现压缩和解压缩的
功能命令格式如下:


压缩/压缩

  1. gzip
  • tar 与 gzip 命令结合可以使用实现文件 打包和压缩
    tar 只负责打包文件,但不压缩
    用 gzip 压缩 tar 打包后的文件,其扩展名一般用 xxx.tar.gz

    在 Linux 中,最常见的压缩文件格式就是 xxx.tar.gz

  • 在 tar 命令中有一个选项 -z 可以调用 gzip ,从而可以方便的实现压缩和解压缩的

示例:

1
2
3
4
5
6
# 压缩文件
tar -zcvf 打包文件.tar.gz 被压缩的文件/路径...
# 解压缩文件
tar -zxvf 打包文件.tar.gz
# 解压缩到指定路径
tar -zxvf 打包文件.tar.gz -C 目标路径
选项 含义
-C 解压缩到指定目录,注意:要解压缩的目录必须存在
  1. bzip2
  • tar 与 bzip2 命令结合可以使用实现文件 打包和压缩(用法和 gzip 一样)
  • tar 只负责打包文件,但不压缩
  • 用 bzip2 压缩 tar 打包后的文件,其扩展名一般用 xxx.tar.bz2
    在 tar 命令中有一个选项 -j 可以调用 bzip2 ,从而可以方便的实现压缩和解压缩的功能

命令格式如下:

1
2
3
4
 压缩文件
tar -jcvf 打包文件.tar.bz2 被压缩的文件/路径...
解压缩文件
tar -jxvf 打包文件.tar.bz2

文件检索

常用通配符

通配符 含义
* 代表任意个数个字符
? 代表任意一个字符,至少 1 个
[] 表示可以匹配字符组中的任一一个
[abc] 匹配 a、b、c 中的任意一个
[a-f] 匹配从 a 到 f 范围内的的任意一个字符

find

格式:find(选项)(参数)

如果省略路径,表示在当前文件夹下查找

find命令默认带有-print选项

  • 列出当前目录及子目录下所有文件和文件夹
    find .

  • 根据文件类型进行搜索
    find . -type 类型参数

类型参数列表:

  • f 普通文件
  • l 符号连接
  • d 目录
  • c 字符设备
  • b 块设备
  • s 套接字
  • p Fifo

wc

统计行数、单词数、字节数
既可以从stdin中直接读入内容;也可以在命令行参数中传入文件名列表;

  • wc -l:统计行数
  • wc -w:统计单词数
  • wc -c:统计字节数

ag

ag xxx

搜索当前目录下的所有文件,检索xxx字符串

sort

将每行内容按字典序排序

  • 可以从stdin中读取多行数据
  • 可以从命令行参数中读取文件名列表

grep

grep xxx:从stdin中读入若干行数据,如果某行中包含xxx,则输出该行;否则忽略该行

选项 含义
-n 显示匹配行及行号
-v 显示不包含匹配文本的所有行(相当于求反)
-i 忽略大小写

cut

从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段输出。

选项参数 功能
-d 分隔符,按照指定分隔符分割列,默认是制表符“\t”
-f 列号,提取第几列
-c 序列号, 提取第几个字符
  • stdin中读入多行数据
  • echo $PATH | cut -d ':' -f 3,5:输出PATH用:分割后第3、5列数据
  • echo $PATH | cut -d ':' -f 3-5:输出PATH用:分割后第3-5列数据
  • echo $PATH | cut -c 3,5:输出PATH的第3、5个字符
  • echo $PATH | cut -c 3-5:输出PATH的第3-5个字符

which

可以查看执行命令所在位

1
2
3
4
yuki@VM-4-3-ubuntu:~$ which ls
/usr/bin/ls
yuki@VM-4-3-ubuntu:~$ which useradd
/usr/sbin/useradd

xargs

给其他命令传递参数的一个过滤器

补充说明:

xargs 命令 是给其他命令传递参数的一个过滤器,也是组合多个命令的一个工具。它擅长将标准输入数据转换成命令行参数,xargs 能够处理管道或者 stdin 并将其转换成特定命令的命令参数。xargs 也可以将单行或多行文本输入转换为其他格式,例如多行变单行,单行变多行。xargs 的默认命令是 echo,空格是默认定界符。这意味着通过管道传递给 xargs 的输入将会包含换行和空白,不过通过 xargs 的处理,换行和空白将被空格取代。xargs 是构建单行命令的重要组件之一。

xargs 用作替换工具,读取输入数据重新格式化后输出。

定义一个测试文件,内有多行文本数据:

1
2
3
4
5
6
7
cat test.txt

a b c d e f g
h i j k l m n
o p q
r s t
u v w x y z

多行输入单行输出:

1
2
3
cat test.txt | xargs

a b c d e f g h i j k l m n o p q r s t u v w x y z

使用 -n 进行多行输出

1
2
3
4
5
6
7
8
9
10
11
cat test.txt | xargs -n3

a b c
d e f
g h i
j k l
m n o
p q r
s t u
v w x
y z

使用 -d 分割输入

1
2
3
4
5
6
7
8
echo "nameXnameXnameXname" | xargs -dX
echo $PATH
/usr/bin:/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
yuki@VM-4-3-ubuntu:~/f$ echo $PATH | xargs -d/
usr bin: bin: usr local sbin: usr local bin: usr sbin: usr bin: sbin: bin: usr games: usr local games: snap bin
yuki@VM-4-3-ubuntu:~/f$ echo $PATH | xargs -d/ | xargs -d:
usr bin bin usr local sbin usr local bin usr sbin usr bin sbin bin usr games usr local games snap bin

结合 -n 选项使用

1
2
3
4
5
6
7
8
9
 yuki@VM-4-3-ubuntu:~/f$ echo $PATH | xargs -d/ -n3
usr bin:
bin: usr local
sbin: usr local
bin: usr sbin:
usr bin: sbin:
bin: usr games:
usr local games:
snap bin

结合 -I 选项

xargs 的一个 选项 -I ,使用 -I 指定一个替换字符串{},这个字符串在 xargs 扩展时会被替换掉,当 -I 与 xargs 结合使用,每一个参数命令都会被执行一次:

sk.sh:

1
2
# /bin/bash
echo $*

arg.txt:

1
2
3
yuki
murasame01
tokisaki
1
2
3
4
yuki@VM-4-3-ubuntu:~/f$ cat arg.txt | xargs -I{} ./sk.sh My username is {} -test
My username is yuki -test
My username is murasame01 -test
My username is tokisaki -test

复制所有txt文件到 ../c 目录下:

1
ls *.txt | xargs -n1 -I{} cp {} ../c

结合 find 命令使用

rm 删除太多的文件时候,可能得到一个错误信息:/bin/rm Argument list too long. 用 xargs 去避免这个问题:

1
find . -type f -name "*.log" -print0 | xargs -0 rm -f

由于xargs默认将空格作为分隔符,所以不太适合处理文件名,因为文件名可能包含空格。
find命令有一个特别的参数-print0,指定输出的文件列表以null分隔。然后,xargs命令的-0参数表示用null当作分隔符


xargs -0\0 作为定界符。
统计一个源代码目录中所有 php 文件的行数:

1
find . -type f -name "*.php" -print0 | xargs -0 wc -l

查找所有的 jpg 文件,并且压缩它们:

1
find . -type f -name "*.jpg" -print | xargs tar -czvf images.tar.gz

打印出执行的命令
结合 -t 选项可以打印出 xargs 执行的命令

1
2
3
4
5
ls | xargs -t -I{} echo {} #会输出当前目录下的文件列表和执行的 echo 命令
echo arg.txt
arg.txt
echo sk.sh
sk.sh

使用 -p 选项确认执行的命令
-p 选项会在执行每一个命令时弹出确认,当你需要非常准确的确认每一次操作时可以使用 -p 参数,比如,查找当前目录下 .log 文件,每一次删除都需要确认:

1
find . -maxdepth 1 -name "*.log" | xargs -p -I{} rm {}

执行多个命令
使用 -I 选项可以让 xargs 执行多个命令

1
2
3
4
5
6
7
8
9
10
11
12
cat foo.txt
one
two
three

cat foo.txt | xargs -I % sh -c 'echo %; mkdir %'
one
two
three

ls
one two three

查看文件内容

  • cat

cat 会一次显示所有的内容,适合查看内容较少 的文本文件

选项 含义
-b 对非空输出行编号
-n 对输出的所有行编号
  • more

适合于 查看内容较多的文本文件

操作键 功能
空格键 显示手册页的下一屏
Enter 键 一次滚动手册页的一行
b 回滚一屏
f 前滚一屏
q 退出
/word 搜索 word 字符串
  • less
    more类似,功能更全
    回车:下一行
    y:上一行
    Page Down:下一页
    Page Up:上一页
    q:退出

  • head -3 xxx:展示xxx的前3行内容
    同时支持从stdin读入内容

  • tail -3 xxx:展示xxx末尾3行内容
    同时支持从stdin读入内容


软件安装

通过 apt 安装/卸载软件

  • apt 是 Advanced Packaging Tool ,是 Linux 下的一款安装包管理工具

  • 可以在终端中方便的 安装/卸载/更新软件包

    1
    2
    3
    4
    5
    6
    # 1. 安装软件
    $ sudo apt install 软件包
    # 2. 卸载软件
    $ sudo apt remove 软件名
    # 3. 更新已安装的包
    $ sudo apt upgrade

    apt-get install和apt install实际上是用于在Debian和Ubuntu等基于Debian的Linux发行版中安装软件包的两种命令行工具,它们在以下方面存在一些差异:

  • 交互性:apt-get install适合将任务整合进工作流,用于自动化等流程,它通常会按照预先设定的规则自动处理安装过程中的冲突和依赖关系。相比之下,apt install是交互式安装,遇到不确定的冲突,选择权在于用户,如果不选择,就不会执行安装。

  • 命令格式:前面提到过,apt-get install和apt install的命令格式略有不同。apt-get install需要使用sudo或作为root用户运行,而apt install则不需要。

软件安装路径查询
* dpkg -l:列出所有已安装的软件包,包括名称、版本号、描述等信息。
* dpkg -L package:查看系统中已经安装的 package 软件包的详细列表。
* dpkg -s package:查看已经安装的 package 软件包的详细信息。
* dpkg -S file:查看系统中的某个文件属于哪个软件包。
*

系统状况

进程信息

命令 作用
ps aux 查看进程的详细状况
top 动态显示运行中的进程并且排序
kill [-9] + pid 终止指定代号的进程, -9 表示强行终止
ps aux process status 查看进程的详细状况

ps 默认只会显示当前用户通过终端启动的应用程序

选项 含义
a 显示终端上的所有进程,包括其他用户的进程
u 显示进程的详细状态
x 显示没有控制终端的进程

top:查看所有进程的信息(Linux的任务管理器, 动态显示运行中的进程并且排序)

  • 打开后,输入M:按使用内存排序
  • 打开后,输入P:按使用CPU排序
  • 打开后,输入q:退出

  • PID:进程id
  • USER:进程所有者的用户名
  • PR:优先级
  • NI:nice值。负值表示高优先级,正值表示低优先级
  • RES:进程使用的、未被换出的物理内存的大小
  • %CPU:上次更新到现在的CPU时间占用百分比
  • %MEM:进程使用的物理内存百分比
  • TIME+:进程所使用的CPU时间总计,单位1/100秒
  • COMMAND:命令名/行
  • PPID:父进程id
  • RUSER:Real user name
  • UID:进程所有者的id
  • VIRT:进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
  • GROUP:进程所有者的组名
  • TTY:启动进程的终端名。不是从终端启动的进程则显示为?
  • NI:nice值。负值表示高优先级,正值表示低优先级
  • P:最后使用的CPU,仅在多CPU环境下有意义
  • TIME:进程使用的CPU时间总计,单位秒
  • SWAP:进程使用的虚拟内存中被被换出的大小
  • CODE:可执行代码占用的物理内存大小
  • DATA:可执行代码以外的部分(数据段+栈)占用的物理内存大小
  • SHR:共享内存大小
  • nFLT:页面错误次数
  • nDRT:最后一次写入到现在,被修改过的页面数
  • S:进程状态(D=不可中断的睡眠状态,R=运行,S=睡眠,T=跟踪/停止,Z=僵尸进程)
  • WCHAN:若该进程在睡眠,则显示睡眠中的系统函数名
  • Flags:任务标志

磁盘信息

命令 作用
df -h disk free 显示磁盘剩余空间
du -h [目录名] disk usage 显示目录下的文件大小
du -sh [目录名] 查看当前目录占用的硬盘空间

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

传递某个具体的信号:kill -s SIGTERM pid

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

w:列出当前登陆的用户


用户权限相关命令

组管理

创建组 / 删除组 的终端命令都需要通过 sudo 执行

命令 作用
groupadd 组名 添加组
groupdel 组名 删除组
cat /etc/group 确认组信息
chgrp -R 组名 文件/目录名 递归修改文件/目录的所属组

将一个用户加入一个组

1
sudo usermod -a -G groupname username
  • -a 参数表示追加用户到组
  • -G 参数后面跟的是组的名称。

查看所有组

1
getent group

查看某个特定的组, 如:
``bash
getent group sudo

1
2
3
4
5

**组信息保存在 /etc/group 文件中**
每一行代表一个组,格式如下:
```bash
group_name:x:group_id:user_list
  • group_name 是组的名称
  • x 是密码占位符,通常不会在这里存储密码
  • group_id 是组的ID
  • user_list 是组中的用户列表,用户之间用逗号分隔

/etc 目录是专门用来保存系统配置信息 的目录

用户管理

创建用户 / 删除用户 / 修改其他用户密码 的终端命令都需要通过 sudo 执行

命令 作用 说明
useradd -m -g 组 新建用户名 添加新用户 -m 自动建立用户家目录
-g指定用户所在组,否则会建立一个和username同名的组
passwd 用户名 设置用户密码 普通用户可以通过passwd直接修改账户密码
userdel -r 用户名 -r会自动删除用户家目录
cat/etc/passwd | grep用户名 确认用户信息 新建用户信息会保存在 /etc/passwd文件中
  • 创建用户时,如果忘记添加 -m 选项指定新用户的家目录 —— 最简单的方法就是删除用户,重新创建
  • 创建用户时,默认会创建一个和用户名同名的组名
  • 用户信息保存在 /etc/passwd 文件中

修改文件权限

命令 作用
chown 修改拥有者
chgrp 修改组
chmod 修改权限

例如:

1
2
3
4
5
6
# 修改文件|目录的拥有者
chown 用户名 文件名|目录名
# 递归修改文件|目录的组
chgrp -R 组名 文件名|目录名
# 递归修改文件权限
chmod -R 755 文件名|目录名

查看配置网卡信息

命令 作用
ifconfig (configure a network interface) 查看/配置计算机当前的网卡配置信息
ping ip地址 (ping) 检测到目标 ip地址 的连接是否正常

常用工具

  1. md5sum:计算md5哈希值
    • 可以从stdin读入内容
    • 也可以在命令行参数中传入文件名列表;
  2. time command:统计command命令的执行时间
  3. ipython3:交互式python3环境。可以当做计算器,或者批量管理文件。
    • ! echo "Hello World“:!表示执行shell脚本
  4. watch -n 0.1 command:每0.1秒执行一次command命令
  5. tar:压缩文件
    • tar -zcvf xxx.tar.gz /path/to/file/*:压缩
    • tar -zxvf xxx.tar.gz:解压缩
  6. diff xxx yyy:查找文件xxxyyy的不同点

环境变量

在Linux中,环境变量是指在操作系统中用来指定操作系统运行环境的一些参数。这些参数通常以键值对的形式存储,例如 PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin,其中 PATH 是键,后面跟着的是值,这个值是多个路径的列表。

列出当前环境下的所有环境变量:

  • env 显示当前用户的变量
  • set 显示当前shell的变量,包括当前用户的变量;
  • export 显示当前导出成用户变量的shell变量

修改

  • 所有用户生效(永久的)
    编辑文件 /etc/profile
    1
    sudo vi /etc/profile
    使编辑立刻生效
    1
    source /etc/profile

    这个文件是系统全局的初始化脚本,每个用户在登录时都会执行一次

  • 对单个用户生效(永久的)
    编辑文件 ~/.bashrc
    • 每次启动bash,都会先执行~/.bashrc。
    • 每次ssh登陆远程服务器,都会启动一个bash命令行给我们。
    • 每次tmux新开一个pane,都会启动一个bash命令行给我们。
    • 所以未来所有新开的环境都会加载我们修改的内容。

在文件末尾添加类似这样的语句

1
2
export PATH=/usr/local/bin:$PATH
# =两侧不能有空格
  • 临时修改环境变量(非永久的)
    直接在终端中使用export命令设置环境变量。这种方法只对当前终端有效,一旦关闭终端或重启系统,修改就会失效
    1
    2
    3
    export PATH=/usr/local/bin:$PATH
    #取消设置
    unset PATH

在Linux和Unix中,每个进程都有自己的环境变量。当在一个shell中设置一个环境变量时,该变量只会在当前shell中生效,而不会在其它shell或其它进程中生效。
当你使用PATH=…的方式设置PATH环境变量时,该变量只会在当前shell中生效,如果你在该shell中执行一个新的子进程,那么子进程将不会继承该环境变量。而如果你使用export PATH=…的方式设置环境变量,那么该变量将会被导出到当前shell的环境中,并且会在当前shell中执行的所有子进程中继承该环境变量。
换句话说,使用export PATH=…的方式可以确保该环境变量在当前shell和所有其它通过该shell执行的子进程中生效,而不仅仅是在当前shell中生效。因此,在需要将一个环境变量导出到整个系统范围内时,应该使用export命令。

常见环境变量

  • HOME:用户的家目录。
  • PATH:可执行文件(命令)的存储路径。路径与路径之间用:分隔。当某个可执行文件同时出现在多个路径中时,会选择从左到右数第一个路径中的执行。下列所有存储路径的环境变量,均采用从左到右的优先顺序。
  • LD_LIBRARY_PATH:用于指定动态链接库(.so文件)的路径,其内容是以冒号分隔的路径列表。
  • C_INCLUDE_PATH:C语言的头文件路径,内容是以冒号分隔的路径列表。
  • CPLUS_INCLUDE_PATH:CPP的头文件路径,内容是以冒号分隔的路径列表。
  • PYTHONPATH:Python导入包的路径,内容是以冒号分隔的路径列表。
  • JAVA_HOME:jdk的安装目录。
  • CLASSPATH:存放Java导入类的路径,内容是以冒号分隔的路径列表。

命令查询工具

感谢此网站:
https://wangchujiang.com/linux-command/