7 管道、环境变量与常用命令
7.1 管道
7.1.1 概念
ㅤㅤ管道类似于文件重定向,可以将前一个命令的stdout
重定向到下一个命令的stdin
7.1.2 要点
ㅤㅤ1. 管道命令仅处理stdout
,会忽略stderr
ㅤㅤ2. 管道右边的命令必须能接受stdin
ㅤㅤ3. 多个管道命令可以串联
7.1.3 与文件重定向的区别
ㅤㅤ●ㅤ文件重定向左边为命令,右边为文件
ㅤㅤ●ㅤ管道左右两边均为命令,左边有stdout
,右边有stdin
7.1.4 举例
ㅤㅤ统计当前目录下所有python文件的总行数,其中find
、xargs
、wc
等命令可以参考常用命令这一节内容。
ㅤㅤfind . -name '*.py' | xargs cat | wc -l
7.2 环境变量
7.2.1 概念
ㅤㅤLinux系统中会用很多环境变量来记录配置信息
ㅤㅤ
ㅤㅤ环境变量类似于全局变量,可以被各个进程访问到。我们可以通过修改环境变量来方便地修改系统配置
7.2.2 查看
ㅤㅤ列出当前环境下的所有环境变量:
ㅤㅤenv # 显示当前用户的变量
ㅤㅤset # 显示当前shell的变量,包括当前用户的变量;
ㅤㅤexport # 显示当前导出成用户变量的shell变量
ㅤㅤ输出某个环境变量的值:
ㅤㅤecho $PATH
7.2.3 修改
ㅤㅤ环境变量的定义、修改、删除操作可以参考3. shell语法——变量这一节的内容。
ㅤㅤ为了将对环境变量的修改应用到未来所有环境下,可以将修改命令放到~/.bashrc
文件中
ㅤㅤ修改完~/.bashrc
文件后,记得执行source ~/.bashrc
,来将修改应用到当前的bash
环境下
ㅤㅤ为何将修改命令放到~/.bashrc
,就可以确保修改会影响未来所有的环境呢?
ㅤㅤ●ㅤ每次启动bash,都会先执行~/.bashrc
ㅤㅤ●ㅤ每次ssh
登陆远程服务器,都会启动一个bash
命令行给我们
ㅤㅤ●ㅤ每次tmux
新开一个pane
,都会启动一个bash
命令行给我们
ㅤㅤ●ㅤ所以未来所有新开的环境都会加载我们修改的内容
7.2.4 常见环境变量
ㅤㅤ1. HOME
:用户的家目录
ㅤㅤ
ㅤㅤ2. PATH
:可执行文件(命令)的存储路径。路径与路径之间用:
分隔。当某个可执行文件同时出现在多个路径中时,会选择从左到右数第一个路径中的执行。下列所有存储路径的环境变量,均采用从左到右的优先顺序
ㅤㅤ3. LD_LIBRARY_PATH
:用于指定动态链接库(.so
文件)的路径,其内容是以冒号分隔的路径列表
ㅤㅤ4. C_INCLUDE_PATH
:C
语言的头文件路径,内容是以冒号分隔的路径列表
ㅤㅤ5. CPLUS_INCLUDE_PATH
:CPP
的头文件路径,内容是以冒号分隔的路径列表
ㅤㅤ6. PYTHONPATH
:Python
导入包的路径,内容是以冒号分隔的路径列表
ㅤㅤ7. JAVA_HOME
:jdk
的安装目录
ㅤㅤ8. CLASSPATH
:存放Java
导入类的路径,内容是以冒号分隔的路径列表
7.3 常用命令
ㅤㅤLinux
命令非常多,本节讲解几个常用命令。其他命令依赖于大家根据实际操作环境,边用边查
7.3.1 系统状况
ㅤㅤ1. top
:查看所有进程的信息(Linux
的任务管理器)
ㅤㅤㅤㅤ●ㅤ打开后,输入M
:按使用内存排序
ㅤㅤㅤㅤ●ㅤ打开后,输入P
:按使用CPU
排序
ㅤㅤㅤㅤ●ㅤ打开后,输入q
:退出
ㅤㅤ2. df -h
:查看硬盘使用情况
ㅤㅤ3. free -h
:查看内存使用情况
ㅤㅤ4. du -sh
:查看当前目录占用的硬盘空间
ㅤㅤ
ㅤㅤ5. ps aux
:查看所有进程
ㅤㅤ6. kill -9 pid
:杀死编号为pid
的进程
ㅤㅤㅤㅤ●ㅤ传递某个具体的信号:kill -s SIGTERM pid
ㅤㅤ7. netstat -nt
:查看所有网络连接
ㅤㅤ8. w
:列出当前登陆的用户
ㅤㅤ9. ping www.baidu.com
:检查是否连网
7.3.2 文件权限
ㅤㅤ1. chmod
:修改文件权限
ㅤㅤㅤㅤ●ㅤchmod +x xxx
:给xxx
添加可执行权限
ㅤㅤㅤㅤ●ㅤchmod -x xxx
:去掉xxx
的可执行权限
ㅤㅤㅤㅤ●ㅤchmod 777 xxx
:将xxx
的权限改成777
ㅤㅤㅤㅤ●ㅤchmod 777 xxx -R
:递归修改整个文件夹的权限
7.3.3 文件检索
ㅤㅤ1. find /path/to/directory/ -name '*.py'
:搜索某个文件路径下的所有*.py
文件
ㅤㅤ2. grep xxx
:从stdin
中读入若干行数据,如果某行中包含xxx
,则输出该行;否则忽略该行
ㅤㅤ3. wc
:统计行数、单词数、字节数
ㅤㅤㅤㅤ●ㅤ既可以从stdin
中直接读入内容;也可以在命令行参数中传入文件名列表;
ㅤㅤㅤㅤ●ㅤwc -l
:统计行数
ㅤㅤㅤㅤ●ㅤwc -w
:统计单词数
ㅤㅤㅤㅤ●ㅤwc -c
:统计字节数
ㅤㅤ4. tree
:展示当前目录的文件结构
ㅤㅤㅤㅤ●ㅤtree /path/to/directory/
:展示某个目录的文件结构
ㅤㅤㅤㅤ
ㅤㅤㅤㅤ●ㅤtree -a
:展示隐藏文件
ㅤㅤ5. ag xxx
:搜索当前目录下的所有文件,检索xxx字符串
ㅤㅤ6. cut
:分割一行内容
ㅤㅤㅤㅤ●ㅤ从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个字符
ㅤㅤ7. sort
:将每行内容按字典序排序
ㅤㅤㅤㅤ●ㅤ可以从stdin
中读取多行数据
ㅤㅤㅤㅤ●ㅤ可以从命令行参数中读取文件名列表
ㅤㅤ8. xargs
:将stdin
中的数据用空格或回车分割成命令行参数
ㅤㅤㅤㅤ●ㅤfind . -name '*.py' | xargs cat | wc -l
:统计当前目录下所有python文件的总行数
7.3.4 查看文件内容
ㅤㅤ1. more
:浏览文件内容
ㅤㅤㅤㅤ●ㅤ回车:下一行
ㅤㅤㅤㅤ●ㅤ空格:下一页
ㅤㅤㅤㅤ●ㅤb
:上一页
ㅤㅤㅤㅤ●ㅤq
:退出
ㅤㅤ2. less
:与more
类似,功能更全
ㅤㅤㅤㅤ●ㅤ回车:下一行
ㅤㅤㅤㅤ●ㅤy
:上一行
ㅤㅤㅤㅤ●ㅤPage Down
:下一页
ㅤㅤㅤㅤ●ㅤPage Up
:上一页
ㅤㅤㅤㅤ●ㅤq
:退出
ㅤㅤ3. head -3 xxx
:展示xxx
的前3行内容
ㅤㅤㅤㅤ●ㅤ同时支持从stdin
读入内容
ㅤㅤ4. tail -3 xxx
:展示xxx
末尾3行内容
ㅤㅤㅤㅤ●ㅤ同时支持从stdin
读入内容
7.3.5 用户相关
ㅤㅤ1. history
:展示当前用户的历史操作。内容放在~/.bash_history
中
7.3.6 工具
ㅤㅤ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
:查找文件xxx
与yyy
的不同点
7.3.7 安装软件
ㅤㅤ1. sudo command
:以root
身份执行command
命令
ㅤㅤ2. apt-get install xxx
:安装软件
ㅤㅤ3. pip install xxx --user --upgrade
:安装python
包
7.4 习题课
homework_0
ㅤㅤ进入 homework_0
文件夹,然后:
ㅤㅤ[1] 编写可执行 shell
脚本,文件名为 mydu
,使得在任意目录执行该脚本后,可以输出当前目录所占用的磁盘空间大小,格式化输出(例如 1K, 234M, 2G)。
ㅤㅤ[2] 修改环境变量 PATH
,使得在任意目录下输入 mydu
均可执行上述脚本。
cd homework_0
vim mydu
#! /bin/bash
du -sh
<ESC> :wq
chmod +x mydu
vim ~/.bashrc
G i
export PATH=/home/acs/homework/leeson_7/homework_0:$PATH
<ESC> :wq
homework_1
ㅤㅤ进入 homework_1
文件夹,然后:
ㅤㅤ[1] 给当前目录下的所有文件添加 可读
权限。
ㅤㅤ[2] 统计当前目录下共有多少个以 .cpp
结尾的文件,将结果写入 ans.txt
中。
cd homework_1
chmod +r * -R
find . -name "*.cpp" | wc -l > ans.txt
homework_2
ㅤㅤ进入 homework_2
文件夹,然后:
ㅤㅤ[1] 统计当前目录下所有 cpp
文件的总行数,将结果写入 ans1.txt
中。
ㅤㅤ[2] 遍历当前目录下所有 py
文件,统计共有多少行包含字符串 thrift
,将结果写入 ans2.txt
中。
cd homework_2
find . -name "*.cpp" | xargs cat | wc -l > ans1.txt
find . -name "*.py" | xargs cat | grep thrift | wc -l > ans2.txt
homework_3
ㅤㅤ进入 homework_3
文件夹,然后删除当前目录下的所有 py
文件。
cd homework_3
find . -name "*.py" | xargs rm
homework_4
ㅤㅤ进入 homework_4
文件夹,然后:
ㅤㅤ[1] 当前目录下包含一个文件 scores.txt
,文件中有若干行数据,每行数据包含用空格隔开的 3
个字段:姓名
、数学成绩
、算法成绩
。
ㅤㅤ[2] 将 scores.txt
文件的内容以空格为分隔符分隔成 3
列,将第一列内容写入 names.txt
,第二列内容写入 mathematics.txt
,第三列内容写入 algorithm.txt
。
ㅤㅤ注意:scores.txt
文件本身不要修改。
cd homework_4
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
ㅤㅤ进入 homework_5
文件夹,然后:
ㅤㅤ[1] 当前目录下包含一个文件 scores.txt
,文件中有若干行数据,每行数据包含用空格隔开的 3
个字段:姓名
、数学成绩
、算法成绩
。
ㅤㅤ[2] 将 scores.txt
文件的内容以空格为分隔符分隔成 3
列 ,将第一列内容按字典序从小到大排序后写入 names.txt
。
ㅤㅤ注意:scores.txt
文件本身不要修改。
cd homework_5
cat scores.txt | cut -d ' ' -f 1 | sort > names.txt
homework_6
ㅤㅤ进入 homework_6
文件夹,然后将 scores.txt
文件的前 5
行写入 top.txt
,后 4
行写入 bottom.txt
。
cd homework_6
head -5 scores.txt > top.txt
tail -4 scores.txt > bottom.txt
homework_7
ㅤㅤ进入 homework_7
文件夹,计算 scores.txt
文件的 md5sum
,将结果写入 ans.txt
。注意:ans.txt
文件中只包含长度为 32
的 md5sum
,不包含其他内容。
cd homework_7
md5sum scores.txt | cut -d ' ' -f 1 > ans.txt
homework_8
ㅤㅤ进入 homework_8
文件夹,然后:
ㅤㅤ[1] 将 dir_a
文件夹压缩为 project_a.tar.gz
。
ㅤㅤ[2] 将 project_b.tar.gz
压缩文件解压到当前目录。
ㅤㅤ注意:不要删除 dir_a
文件夹和 project_b.tar.gz
文件。
cd homework_8
tar -zcvf project_a.tar.gz dir_a/*
tar -zxvf project_b.tar.gz
homework_9
ㅤㅤ进入 homework_9
文件夹,然后计算 2^112^ + 3^78^
,将结果写入 ans.txt
中。
cd homework_9
ipython3
res = 2 ** 112 + 3 ** 78
! echo $res > ans.txt
大佬tql,但homework0里面lesson7有个拼写错误,不过无伤大雅~
homework 9
! echo $res > ans.txt
才对吧
是的,感谢指正。已修改
tql 大佬牛逼