管道 |
管道简介
管道可以连接多条命令,并将前一个命令的标准输出 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 | env # 显示当前用户的环境变量 |
输出某个环境变量的值,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
分别表示可读可写可执行
chmod
:change 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 - compsetar -zxvf xxx.tar.gz -C yyy
:可以将xxx.tar.gz
解压到指定目录,x - extract
6、diff xxx yyy
:查找文件 xxx
与 yyy
的差异
软件安装
1、sudo command
:以 root
身份执行命令
2、apt-get install xxx
:安装软件,需要 sudo
提权
3、pip install xxx --user --upgrade
:安装 python
包
作业代码
homework_0
1 | # [1] |
homework_1
1 | # [1] |
homework_2
1 | # [1] |
homework_3
1 | find . -name "*.py" | xargs rm -r |
homework_4
1 | # 使用 cut 命令按空格 ' ' 切分 |
homework_5
1 | cat scores.txt | cut -d ' ' -f 1 | sort > names.txt |
homework_6
1 | head -5 scores.txt > top.txt |
homework_7
1 | md5sum scores.txt | cut -d ' ' -f 1 > ans.txt |
homework_8
1 | # [1] |
homework_9
1 | # 使用 ipython3 做运算将结果重定向到 ans.txt 文件中 |