linux学习记录(管道、环境变量与常用命令) 10.14~10.15
管道;
类似文件重定向
第一个命令的标准输出至第二个命令的标准输入,第二个文件的标准输出至第三个命令的标准输入

(1)只会处理stdout标准输出,stderr会忽略
(2)管道右边的命令必须能接受stdin(有些指令如:rm tmp -r接收的是文件参数)
(3)多个管道命令可以串联
与文件重定向的区别:
文件重定向的左边为命令,右边为文件
管道左右两边均为命令,左边有stdout,右边有stdin
例:所有.python文件总行数find . -name '*.py' | xargs cat | wc -l
find . -name '*.py'在当前目录下,寻找所有(.)以.py结尾的文件名

xarg cat
cat不能接收标准输入,但是能接收文件名,把上面的标准输入通过xarg转化为文件参数,用空行隔开,传给cat
find . -name '*.py' | xargs cat 是把文件名作为参数,给cat输出,输出的是那些文件的内容
相当于 cat ./match_client/__init__.py ./match_client/match/__init__.py ./match_client/match/Match.py ./match_client/match/constants.py ./match_client/match/ttypes.py ./client.py
find . -name '*.py' | cat 是把文件名当做文件内容,给cat输出

wc 分别统计每个文件的行数,wc -l 统计总行数
环境变量:
Linux系统中会用很多环境变量来记录配置信息,环境变量类似于全局变量,可以被各个进程访问到。我们可以通过修改环境变量来方便地修改系统配置。
(1)查看
列出当前环境下的所有环境变量
env 显示当前用户的变量
set 显示当前shell的变量,包括当前用户的变量
export # 显示当前导出成用户变量的shell变量

可以看到环境变量有SHELL、PWD、LONGNAME、HOME等等...
输出某个环境变量

修改:

通过export修改的环境变量,只会在当前的bash环境下有效,重新登陆(重开一个bash)又变回原来
要想不变:
在家目录下vim .bashrc
在最后一行加上export HOME=/home/acs/homework
再source .bashrc

为什么将修改放到.bashrc中,就可以确保修改会影响未来所有的环境呢?
每次启动bash,都会先执行~/.bashrc
每次ssh登录远程服务器,都会启动一个bash命令给我们
每次tmux新开一个pane,都会启动一个bash命令给我们
所以未来所有新开的环境都会加载我们修改的内容
查看cpu信息:cat proc/cpuinfo
$PATH:可执行文件(命令)的存储路径,通过$PATH环境变量找命令的路径
如command命令,操作系统会遍历$PATH中的所有路径,直到第一个和command匹配的命令为止
如果有一个命令同时出现在多个路径出现,会选择第一个
打开根目录下的bashrc,vim ~/bashrc,加一行

运行一下

发现echo $PATH多了一个目录

然后可以在家目录下直接运行

D_LIBRARY_PATH:用于指定动态链接库(.so文件)的路径,其内容是以冒号分隔的路径列表
告诉去哪找动态链接库的路径
c++在执行编译的时候,所有的库分成动态链接库和静态链接库,(动态库和静态库)
动态库:只有在执行的时候才会去找那个函数 -- 好处:可执行文件变小,更新方便,只需要重新编译动态库

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

PYTHONPATH:Python导入包的路径,内容是以冒号分隔的路径列表。
JAVA_HOME:jdk的安装目录。
CLASSPATH:存放Java导入类的路径,内容是以冒号分隔的路径列表。
常用命令:
(1)系统状况:
1、top:查看所有进程的信息(Linux的任务管理器)
打开后,输入M(大写):按使用内存排序
打开后,输入P(大写):按使用CPU排序
打开后,输入q:退出
2、df -h
disk free
查看硬盘使用情况
3、free -h
查看内存使用情况
4、du -sh
disk usage
查看当前目录占用的硬盘空间
-h 显示出所有文件的占用情况
5、ps aux / -ef
process status
查看所有进程

grep xxx 看是否存在xxx字符串,存在就输出
6、kill -9 pid
杀死编号为pid的进程
传递某个具体的信号:kill -s SIGTERM pid(有些个别不能kiil -9)
-9 SIGKILL -15 SIGTERM
7、netstat -nt
查看所有网络连接
8、ping www.baidu.com
检查是否连网
(2)文件权限:
10位
d _ _ _ | _ _ _ | _ _ _
第一位表示是不是文件夹、超链接...,后面rwx三位一组(代表自己,同组,其他人能不能访问)
chmod +x xxx 给xxx添加可执行权限
chmod -x xxx 去掉xxx可执行权限
chmod +r xxx 给xxx添加可读权限
chmod -r xxx 去掉xxx可读权限
chmod +r * -R
chmod 777 xxx -R:递归修改整个文件夹的权限
...
(3)文件检索
1、find

2、grep xxx
从标准输入中读取,如果含有xxx就显示+标记

ctrl+d结束
find

find出的那些地址,作为参数传给cat显示,再作为输入,传给grep
找出所有cpp文件中,含有acs_3144的行
我们不知道上面的行是哪个文件怎么办?
3、ag命令,在当前目录下查找,会列出在哪个文件里,哪一行

***注:ag很重要
4、wc

238行(-l line),576个单词(-w word),7469字节(-c char)

wc也可以接收标准输入的内容

查看当前文件夹下所有.cpp文件一共有多少行

5、tree
查看文件夹结构
+ -a罗列时候会包含隐藏文件
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

将每行内容按字典序排序
find homework/lesson_6 | sort
8、将将stdin中的数据用空格或回车分割成命令行参数
(4)查看文件内容
1、more
cat整个输出
more先输出一部分
回车:下一行
空格:下一页
b:上一页
q:退出
2、less
与more类似,功能更全
回车:下一行
y:上一行
Page Down:下一页
Page Up:上一页
q:退出
3、head
head -10 查找某个文件前十行内容
4、tail
tail -10 查找某个文件后十行内容

(5)用户相关
1、history 查看当前用户的历史操作记录,内容存放在~/.bash_history中
修改.bash_history,可持久化
(6)工具
1、md5sum
计算md5哈希值
可以从stdin读入内容
也可以在命令行参数中传入文件名列表
反推几乎不可能
用户输入密码->转化为hash值->和数据库内的hash值对比,这样就可以不存储密码
可以用到练习册:不希望学生看原文,同时结果可以评测
2、time command:统计command命令的执行时间
3、ipython3:交互式python3环境。可以当做计算器,或者批量管理文件。
4、watch -n 0.1 command:每0.1秒执行一次command命令
crontab 每周几去备份,重启完执行什么命令
5、tar
压缩文件(zcvf)
tar -zcvf ttt.tar.gz tmp 将tmp文件夹中的所有文件压缩,命名为ttt.tar.gz
解压文件(zxvf)
tar -zxvf ttt.tar.gz
6、diff xxx yyy:查找文件xxx与yyy的不同点
(7)安装软件
1、sudo command 以root身份执行command命令
2、apt-get install xxx:安装软件
3、pip install xxx --user --upgrade:安装python包

浙公网安备 33010602011771号