管道类似文件重定向,可以将前一个命令的stdout
重定向到下一个命令的stdin
stdout
,会忽略stderr
stdin
与文件重定向的区别
stdout
,右边的命令要有stdin
统计当前目录所有python
文件的总行数
find . -name '*.py' | xargs cat | wc -l
对上面的命令进行解释:
首先,我们单独运行find . -name '*.py'
,会查找出当前目录下,所有以py
结尾的文件,如下
而我们的cat
命令,其作用是,给定一堆文件,将文件的内容,输出到stdout
中(Concatenate FILE(s) to standard output
),所以,cat
命令,它接收参数,参数指定了文件名,比如cat console.log
,表示将console.log
这个文件中的内容,输出到stdout
。
而xargs
的作用,就是将前一个命令的stdout
,转变为行参数(用空格隔开),传递给下一个命令。
假设find . -name '*.py'
的结果是
./client.py
./server.py
则find . -name '*.py' | xargs cat
就相当于cat ./client.py ./server.py
而cat
会将多个文件的内容输出到stdout
,此时再通过管道命令,将stdout
传递给下一个命令wc -l
,(-l
for lines)就会从stdout
中统计出行数。所以
find . -name '*.py' | xargs cat | wc -l
这个命令,实现的效果就是,统计当前目录下所有python
文件的代码总行数。结果如下
如果上面的命令,不加xargs
,会是什么效果呢
find . -name '*.py' | cat | wc -l
此时,实际统计的,就是当前目录下python
文件的个数。(cat
命令也接受stdin
的数据,接收stdin
时,就仅仅是将stdin
输出到stdout
)
查看某个命令的用法,可以通过cmd --help
,或者man cmd
进行。比如查看wc
命令的用法,执行wc --help
Usage: wc [OPTION]... [FILE]...
or: wc [OPTION]... --files0-from=F
Print newline, word, and byte counts for each FILE, and a total line if
more than one FILE is specified. A word is a non-zero-length sequence of
characters delimited by white space.
With no FILE, or when FILE is -, read standard input.
The options below may be used to select which counts are printed, always in
the following order: newline, word, character, byte, maximum line length.
-c, --bytes print the byte counts
-m, --chars print the character counts
-l, --lines print the newline counts
--files0-from=F read input from the files specified by
NUL-terminated names in file F;
If F is - then read names from standard input
-L, --max-line-length print the maximum display width
-w, --words print the word counts
--help display this help and exit
--version output version information and exit
Linux系统中有很多配置信息。其中,有一些配置信息,是记录在文件中的,比如系统的cpu
信息,记录在/proc/cpuinfo
这个文件中
cat /proc/cpuinfo
但是Linux也有一些配置信息,是放在环境变量里的。环境变量,是一种全局变量,可以被各个进程访问到,我们可以通过修改环境变量来修改系统的一些配置,很方便。
查看当前环境下的全部环境变量
env # 显示当前用户的变量
set # 显示当前shell的变量,包括当前用户的变量
export # 显示当前导出为用户变量的shell变量
查看某个环境变量,比如查看PATH
这个环境变量
echo $PATH
可以参考shell
语法章节 - 变量 小节。
比如修改HOME
变量
export HOME=/
随后我们执行cd
命令,当cd
命令没有参数时,会回到用户的家目录(也就是回到环境变量HOME
指定的目录),此时我们可以看到回到了根目录/
但是export
命令修改的环境变量,只对当前这个bash
生效,当我们关闭bash
并重新打开一个,会发现之前的修改已失效。
那么,如何将环境变量的修改进行持久化呢?(也就是说,修改完后,我们希望之后打开的所有bash
,都能够应用到此修改)
可以将修改命令放到~/.bashrc
(放到这个文件的末尾,因为如果存在相同命令,后面的会覆盖前面的),修改完~/.bashrc
后,记得source ~/.bashrc
,来将修改应用到当前的bash
环境
为何将修改命令放到~/.bashrc
后,就可以确保修改会影响未来的所有bash
环境呢?因为
bash
,都会先执行~/.bashrc
ssh
登录远程服务器,都会启动一个bash
命令行给我们tmux
新开一个pane
,都会启动一个bash
命令行给我们由于每次启动bash
,都会加载一遍~\.bashrc
,所以未来所有新开的bash
环境,都会加载我们修改的内容。
(其实Linux下执行的命令,都是单独开一个进程去执行的,比如执行一个不会立即结束的命令top
,可以看到最下面的那个进程就是执行top
命令的进程。)
HOME
:用户的家目录PATH
:可执行文件(命令)的存储路径。路径之间用:
分隔。在bash
命令行中执行一个命令,Linux系统是怎么找到这个命令的呢?是通过遍历PATH
变量下的目录,从这些目录中找到(第一个)匹配的命令或可执行文件。当某个可执行文件同时出现在多个路径中时,会选择从左到右数第一个路径中的执行。下列所有存储路径的环境变量,均采用从左到右的优先顺序。LD_LIBRARY_PATH
:用于指定动态链接库(.so文件)的路径,其内容是以冒号分隔的路径列表。C_INCLUDE_PATH
:C语言的头文件路径,内容是以冒号分隔的路径列表。CPLUS_INCLUDE_PATH
:CPP的头文件路径,内容是以冒号分隔的路径列表。PYTHONPATH
:Python导入包的路径,内容是以冒号分隔的路径列表。JAVA_HOME
:jdk的安装目录。CLASSPATH
:存放Java导入类的路径,内容是以冒号分隔top
:查看所有进程的信息(Linux的任务管理器)
M
:按使用内存排序P
:按使用CPU排序q
:退出df -h
:查看硬盘使用情况free -h
:查看内存使用情况du -sh
:查看当前目录占用的硬盘空间du -h --max-depth=1
ps aux
:查看所有进程kill -9 pid
:杀死编号为pid
的进程
kill -s SIGTERM pid
netstat -nt
:查看所有网络连接w
:列出当前登陆的用户ping www.baidu.com
:检查是否连网chmod
:修改文件权限
chmod +x xxx
:给xxx
文件添加可执行权限chmod -x xxx
:给xxx
文件去掉可执行权限chmod 777 xxx
:将xxx
的权限改成777chmod 777 xxx -R
:递归修改整个文件夹的权限其余关于Linux的权限:见附录
find /path/to/directory/ -name '*.py'
:搜索某个文件路径下的所有*.py
文件
grep xxx
:从stdin
中读入若干行数据,如果某行中包含xxx
,则输出该行。(也可以添加文件名作为参数,则就是查找某个文件中的某一行是否出现xxx
,若出现,则将那一行输出到stdout
)
wc
:统计行数,单词数,字节数
stdin
中直接读取内容,也可以传入文件名作为参数wc -l
:统计行数wc -w
:统计单词数wc -c
:统计字节数wc --help
:查看帮助文档tree
:展示当前目录的文件结构
tree /path/to/directory/
:展示某个目录的文件结构tree -a
:展示所有文件(包括隐藏文件)ag xxx
:搜索当前目录下的所有文件,检索xxx
字符串(会列出xxx
在哪个文件中的哪一行)
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个字符sort
:将每行内容按照字典序排序
stdin
中读取多行数据xargs
:将stdin
中的数据用空格或回车分割成命令行参数
例:find . -name '*.py' | xargs cat | wc -l
:统计当前目录下所有python文件的总行数
more
:浏览文件内容
b
:上一页q
:退出less
:与more
类似,功能更全
y
:上一行Page Down
:下一页Page Up
:上一页q
:退出head -3 xxx
:展示xxx
的前三行tail -3 xxx
:展示xxx
的末尾三行history
:展示当前用户的历史操作。内容会持久化到~/.bash_history
md5sum
:计算md5
值
stdin
读取数据(stdin
输入数据后,敲回车,再按Ctrl + D
结束输入)time cmd
:统计cmd
命令的执行时间ipython3
:交互式python3
环境。可以做计算器,或批量管理文件tar
:压缩文件
tar -zcvf xxx.tar.gz /path/to/file/*
:压缩指定目录下所有文件tar -zxvf xxx.tar.gz
:解压缩diff xxx yyy
:查找文件xxx
与yyy
的不同点sz file
:在Xshell等工具中,发送服务器的文件到本地(s for send)rz
:在Xshell等工具中,发送本地的文件到服务器(r for read)apt-get install lrzsz
,先进行安装sudo cmd
:以root
身份执行cmd
命令apt-get install xxx
:安装某个软件(ubuntu)pip install xxx --user --upgrade
:安装python包用ls -l
查看当前目录的文件
最左一列的是文件的权限相关信息,一共有10位,最左侧的第1位表示文件类型,如上图
d
:表示文件夹,directory
l
:表示链接,link
f
:表示普通文件,file
后面的9位代表权限,前3位表示文件所有者的权限,中间3位表示文件所属用户组的权限,后3位表示其他用户的权限。
左边第二列的数字表示这个文件的连接数
左边第三列表示这个文件的拥有者(owner)
左边第四列表示这个文件所属的用户组
左边第五列表示这个文件的大小
左边第六列表示这个文件的修改时间
比如,
dr-xr-x---. 22 root root 4096 10月 20 15:01 root
这个root,是个文件夹,并且其owner是root用户,其属于root用户组,大小位4096字节。
左边第一列,后9位是文件权限,前3位是owner权限,r-x
,表示这个root文件夹,对于root用户,是可读,可执行的,中间3位是用户组权限,r-x
表示这个root文件夹,对于root用户组里的用户,是可读,可执行的,最后3位是其他用户的权限,---
表示其他用户对这个文件夹不可读,不可写,不可执行。
可以为某个文件修改权限,使用chmod
chmod u+x run.sh
给run.sh这个文件的owner添加执行权限
chmod g+r run.sh
给run.sh这个文件所属的用户组添加读权限
chmod o-w run.sh
给run.sh这个文件的其他用户删除写权限
chmod a+x run.sh
给run.sh这个文件的所有用户添加执行权限
权限就3种,rwx
,读,写,执行,也用3个二进制位来表示,比如111
表示三个权限都有,十进制就是7,110
表示只有读写权限,十进制就是6,一般我们会用chmod 777 run.sh
给全部用户添加全部权限
chmod 751 run.sh
给run.sh的owner添加全部全写,给其所属的用户组添加读,执行权限(101
),给其他用户添加执行权限001
chmod u=rwx,g=rx,o=x run.sh
效果跟上面的命令一样
chmod =r run.sh
给所有用户分配读权限(augo
不写的话默认是a
)
chmod 444 run.sh
效果同上
chmod -R u+r dir
递归地给 dir
这个目录下所有文件及其子目录的owner分配读权限
若想要改变某个文件的owner,可以用chown
命令(有时某个目录或文件没有执行权限,可以通过修改文件或目录的owner来解决)
如,递归的给dir
目录下的所有文件及子目录修改其owner为yogurt
chown -R yogurt:yogurt dir/
第一个yogurt是用户,第二个yogurt是所属用户组
如何查看系统都有哪些用户?
cat /etc/passwd
只看用户名称
cat /etc/passwd | cut -f1 -d :
查看某个用户的所属组
groups
查看当前用户所属的用户组
groups yogurt
查看用户yogurt所属的用户组
切换用户:su root
切换到root用户 ,su yogurt
切换到yogurt用户(su
for switch user,or shift user)
不带参数的su
表示切换到root用户
注意,su
只是切换了用户,而没有切换用户所使用的shell,即,如果当前用户是yogurt
然后我使用su root
切换到root用户,则只是换了用户身份,但是shell环境仍然是yogurt的shell,所以在root的PATH变量中的一些命令,是调用不到的
可以看到,只是切换用户的话,当前工作目录都没有发生变化。用su -
,会同时切换shell环境。用su
只切换用户身份
sudo
表示以root权限来运行某个命令。默认情况下,只有root用户才能执行sudo
命令,但可以让普通用户以root权限执行某条命令,只要将该用户配置在/etc/sudoers
里面即可,
比如sudo su
表示以root权限来运行su
命令,这样可以不用输入密码root的密码(前提是,在/etc/sudoers
配置文件中配置当前用户)
比如当前用户是yogurt,若没进行配置
则会要求输入yogurt的密码
用root用户,修改/etc/sudoers
配置文件
然后再在yogurt用户下,用sudo su
就能直接切换到root
当然,用su
来切换到root,仍然需要输入root密码