AcWing「Linux基础课」第 7 讲 管道、环境变量及其常用命令

管道 |

管道简介

管道可以连接多条命令,并将前一个命令的标准输出 stdout 作为下一个命令的标准输入 stdin。当我们可以把一个任务分解成多条命令的时候,管道操作非常常用

注意:

  • 管道命令仅处理标准输出 stdout,忽略错误 stderr
  • 管道右边的命令必须能够接收标准输入 stdin,才能将当前命令的标准输出传给它。

管道命令与文件重定向类似,最主要的区别:

  • 文件重定向左边是命令,右边是文件,将左边命令的标准输出输出到文件中。
  • 管道左右两遍都是命令,且左边要有 stdout 右边要能够接收 stdout
  • 管道可以接多条命令,ps -aux | grep "java",而文件重定向将左边一条命令的输出重定向到指定的文件。

示例

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

1
find . -name "*.py" | xargs cat | wc -l
  • find:查找当前目录下所有后缀名是 .py 的文件
  • xargs:将 find 的输出结果作为参数传给 cat 命令,即查看这些 .py 文件的内容
  • wc:统计所有文件内容的总行数,最后输出

2、统计当前目录下所有 python 文件个数

1
find . -name "*.py" | wc -l

环境变量

环境变量简介

和 Windows 系统一样,Linux 系统中也有很多环境变量用来记录配置信息,环境变量类似于全局变量,可以被所有的进程访问到,通过修改环境变量可以很方便地修改系统配置。

查看环境变量

有三个命令可以列出当前系统中的环境变量,输出会有区别:

1
2
3
env # 显示当前用户的环境变量
set # 显示当前 shell 的环境变量,包含当前用户的环境变量
export # 显示当前导出成用户变量的 shell 变量

输出某个环境变量的值,shell 语法 $ 取值

echo $PATH

修改环境变量

比如修改当前系统的家目录 home/acs 修改为 home/acs/homework,可以使用 export 命令导出环境变量

1
export HOME=home/asc/homework

然后执行 cd 到家目录,此时发现家目录已经变成了 home/acs/homework

但重新打开 Terminal 的时候发现刚才的配置消失了,因为在命令行中执行修改后,只会在当前会话中生效,新建会话后会重新执行 bash 终端配置文件 .bashrc,而刚才的配置不在配置文件中,所以自然就失效了。


所以想要我们的配置永久生效,我们可以直接修改 .bashrc 文件,然后执行 source .bashrc 刷新配置让其马上生效。

常见环境变量

  • HOME:用户家目录

  • PATH:存放系统中可执行文件(命令)的路径,每个路径之间用 : 隔开,当某个命令同时在多个路径中出现时,会选择从左往右第一个出现的路径中的命令执行(短路原则)。下列所有存储路径的环境变量,均采用从左到右的优先顺序。

  • C_INCLUDE_PATH:C 语言的头文件路径,内容是以冒号分隔的路径列表。

  • CPLUS_INCLUDE_PATH:CPP的头文件路径,内容是以冒号分隔的路径列表。

  • PYTHONPATH:Python 导入包的路径,内容是以冒号分隔的路径列表。

  • JAVA_HOME:JDK 的安装目录。

  • CLASSPATH:存放 Java 导入类的路径,内容是以冒号分隔的路径列表。

小技巧:可以将自己的可执行文件(命令)的存放路径放到 PATH 环境变量中,然后 source .bashrc 刷新配置,然后就可以在终端中的任何地方像执行 ls 一样直接执行我们的命令,非常 cool。

比如是可执行脚本文件,不能加 .sh 后缀名,否则添加环境变量后不能识别。

常用命令

查看系统状态

1、top:查看系统所有进程的信息

  • 输入 M 按内存使用率从大到小排序
  • 输入 P 按 CPU 使用率从大到小排序
  • 输入 q 退出 top

2、df -h:查看硬盘使用情况,人性化展示 (h - humanity,我猜的 hh)

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

4、du:统计占用硬盘空间

  • du -sh:统计当前目录占用的硬盘空间
  • du -ch:统计当前目录下所有文件和文件夹占用的空间

5、ps aux:查看所有进程

  • 通常配合 | grep 进程名 查找某个进程,找到进程号 pid
  • kill -9 pid 杀掉这个进程

6、kill -9 pid:杀掉进程号为 pid 的进程

  • -9 对应的信号是 SIGKILL

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

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

8、w:列出当前登录的用户

9、ping www.xxx.com:检查是否与某个网站联通

10、history:查看输入的历史命令,内容存放在 ~/.bash_history 只会保存最近的 2000 条,显示 1000 条。

文件权限

首先要知道 Linux 下一切皆文件,目录也是文件哦。

Linux 文件权限,总共有 10 位

  • 1:表示文件类型,可以是文件、目录、链接
  • 2-4:表示当前用户对该文件所拥有的权限
  • 5-7:表示当前用户组对该文件所拥有的权限
  • 8-10:表示其他用户对该文件所拥有的权限

其中 rwx 分别表示可读可写可执行

image-20220403162555777.png

chmodchange mode 修改文件权限

1、通过 + - 权限字母设置文件权限

  • chmod +x filename:给 filename 添加可执行权限
  • chmod -x filename:去掉 filename 的可执行权限
  • 同理,可读可写权限 -r -w 修改一样的。

2、通过三组数字设置文件权限

  • chmod 777 filename:将 filename 的权限设置为 777,777 表示可读可写可执行。
  • chmod 777 filename -R:递归修改整个文件夹的权限。

文件检索

1、find directory -name '*.py' :搜索指定目录下所有 .py 文件,并将其路径输出出来

2、grep xxx:从 stdin 中多行内容,如果某行中包含要搜索的内容 xxx,则输入该行,否则忽略改行。

  • grep 命令一般配合其他命令一起使用,通过管道处理上一个命令的输出结果。

  • 比如:输出当前目录下所有 .py 文件中包含 hello 的行。

    1
    find . -name "*.py" | xargs cat | grep 'hello' 

3、wc:统计行数、单词数和字节数

  • 可以从标准输入 stdin 中读入内容,也可以从指定文件中读入内容,也可以从命令行中传入文件参数列表
  • wc -l:统计总行数
  • wc -w:统计总单词数
  • wc -c:统计总字节数

4、tree / tree .:树形展示当前目录的文件结构

  • tree dirctory :展示指定目录的文件结构
  • tree -a:可以展示隐藏文件
  • tree -h:可以展示每个文件的大小

5、ag xxx常用,搜索当前目录下的所有文件,检索 xxx 字符,输出所有包含 xxx 的行并且显示其对应的文件。

6、cut:分割一行内容

  • 可以从标准输入中读取多行数据

  • 举例:

    `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个字符
    

7、sort:将每行内容按字典序排序

  • 可以从stdin中读取多行数据
  • 可以从命令行参数中读取文件名列表
  • 举例:cat xxx.txt | sort,将文件内容按每行字典序排序输出

8、xargs:将 stdin 中的数据用空格或回车分割成命令行参数

经典例子:统计当前目录下所有 python 文件的总行数

1
find . -name '*.py' | xargs cat | wc -l 

查看文件内容

1、more:从前往后输出一页内容,回车下一行、空格下一页、b 上一页、q 退出查看

2、less:和 more 类似,回车下一行,y 上一行,Page Down 下一页,Page Up 上一页,q 退出,比 more 功能更多。

3、head -3 xxx:展示 xxx 的前 3 行内容

  • 支持 stdin 读入内容

4、tail -3 xxx:展示 xxx 末尾 3 行内容,一般用于查看最新的日志。

  • 支持 stdin 读入内容

工具

1、md5sum:计算文件 md5 哈希值

  • 可以从 stdin 读入内容,按 Ctrl + d 结束,同时输出 md5 哈希值

2、time comand:统计 command 命令的执行时间

3、ipython3:一个 python 交换环境,可以用做计算器哈哈。

  • ! echo "hello"! 表示执行 shell 脚本

4、watch -n -1 command:每 1s 执行一次命令

5、tar:压缩解压缩

  • tar -zcvf xxx.tar.gz yyy:将目录 yyy 压缩成 xxx.tar.gz,c - compse
  • tar -zxvf xxx.tar.gz -C yyy:可以将 xxx.tar.gz 解压到指定目录,x - extract

6、diff xxx yyy:查找文件 xxxyyy 的差异

软件安装

1、sudo command:以 root 身份执行命令

2、apt-get install xxx:安装软件,需要 sudo 提权

3、pip install xxx --user --upgrade:安装 python

作业代码

homework_0

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# [1]
vim mydu

#! /bin/bash
du -sh

:wq

# [2] 修改环境变量 PATH,将 mydu 所在目录加入到环境变量中
cd
vim .bashrc
export PATH=/home/acs/homework/lesson_7/homework_0:ŞPATH
:wq

source .bashrc

homework_1

1
2
3
4
5
# [1]
chmod +r ./*

#[2]
find . -name "*.cpp" | wc -l > ans.txt

homework_2

1
2
3
4
5
# [1]
find . -name "*.cpp" | xargs cat | wc -l > ans1.txt

# [2]
find . -name "*.py" | xargs cat | grep "thrift" | wc -l > ans2.txt

homework_3

1
find . -name "*.py" | xargs rm -r

homework_4

1
2
3
4
# 使用 cut 命令按空格 ' ' 切分
cat scores.txt | cut -d ' ' -f 1 > names.txt
cat scores.txt | cut -d ' ' -f 2 > mathematics.txt
cat scores.txt | cut -d ' ' -f 3 > algorithm.txt

homework_5

1
cat scores.txt | cut -d ' ' -f 1 | sort > names.txt

homework_6

1
2
head -5 scores.txt > top.txt
tail -4 scores.txt > bottom.txt

homework_7

1
md5sum scores.txt | cut -d ' ' -f 1 > ans.txt

homework_8

1
2
3
4
# [1]
tar -zcvf project_a.tar.gz dir_a/
# [2]
tar -zxvf project_b.tar.gz

homework_9

1
2
3
4
5
6
# 使用 ipython3 做运算将结果重定向到 ans.txt 文件中
ipython3
2 ** 112 + 3 ** 78
16428395565119192973859998297038475385
!echo 16428395565119192973859998297038475385 > ans.txt
exit

image-20220403192533724.png

Author: tonngw
Link: https://tonngw.com/2022/04/06/AcWing/第 7 讲 管道、环境变量及其常用命令/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.