赞
踩
Linux/Unix系统的一大特点是包括很多功能各异的小工具。根据Unix的设计理念“Do One Thing and Do It Well”,每个小工具实现了某个单一功能。这一部分介绍各种工具,下一部分介绍怎样将工具融合起来,发挥更大的威力。
对于每一个命令,可以用man <cmd>来看帮助页面. 习惯上, 很多命令也支持使用 <cmd> --help 来获取帮助信息.
# 之后是注释。
标注输出/标准错误/标准输入
程序运行时会产生输出。一般程序有两种输出,一种叫做标准输出(stdout),一种叫做标准错误(stderr)。习惯上,前者用来表示程序正常运行的输出,后者用来表示更特殊的输出,如错误和提醒。在terminal中人手动交互的键入命令执行时,stdout和stderr都会输出到terminal中,仅从视觉上效果相同。
标准输入(stdin)是指程序运行时,从terminal中读入人手动键入的文字。
stdout/stderr/stdin都有一些高级用法,下面会做介绍。
echo printf |
echo把参数输出到屏幕:
printf和c语言里的printf很像,第一个参数是format string,后面的参数是format string里的参数:
注意echo默认会输出一个new line,而printf不会。 | ||
stdout stderr |
程序的输出包括stdout和stderr,默认都会输出到屏幕上。 可以用下面的方法把输出保存到文件里:
| ||
stdin |
|
能把多个命令组合起来是bash很强大的功能。.把不同的命令组合起来,有很多种方法. 这部分很有用但难度稍高, 建议整体Bash教程学完后再回看一遍.
| |
可以用|(管道、pipe)把多个命令组合起来,前一个命令的输出会成为后一个命令的输入。
| ||
&& || |
另外一种方法是用逻辑运算符&&。由于每个命令会返回一个返回值,命令a && b的执行方式是: (1)bash 先执行 a (2)如果a失败了(返回结果不是0),那么根据short circuiting,第二个命令b就不会被执行。 (3)如果a成功了(返回结果是0),那么第二个命令b就会接着被执行。 例子:
类似的组合方法包括逻辑运算符||。例子:
| ||
$() `` |
使用$(this_is_a_command)方式,可以把一个命令的输出嵌入成另一个命令的一部分。
| ||
()多命令group |
()内部有多个命令时, 可以统一操作这些命令的stdout和stderr
|
在命令行中,任何时候都有一个“当前工作目录”(working directory)。用pwd命令查看工作目录。用cd改变工作目录。用ls查看目录里的文件和目录。
pwd |
查看当前工作目录。
| |
ls |
查看当前工作目录下的文件和文件夹。
其中books和phones是目录,readme.txt是文件。 | |
cd |
切换目录。
| |
basename |
去掉文件路径中的目录, 仅保留文件名.
| |
du |
统计文件夹大小。
| |
df |
统计磁盘分区利用情况。
| |
ncdu |
是du的升级版。统计文件空间大小后,可以深入下层文件夹。实际中可以用于清理空间时追查到底什么文件占用了大量空间。
|
在系统中查找文件,可以用下面的命令。
find |
查找文件。
文件名也可以带*进行匹配。
|
对文件进行移动、拷贝、创建文件夹等,可以用下面的命令。
cp mv rm chmod mkdir rmdir |
拷贝:cp <file1> <file2> # 把file1拷贝到file2 移动:mv <file1> <file2> # 把file1移动到file2 删除:rm <file> # 把file删除 文件属性:文件一共有9个属性:文件所属用户的读、写、执行;文件所属用户组的读、写、执行;所有用户的读、写、执行。每个属性可以用一个bit来表示。比如:
可以看到文件属性是:用户可读、写文件,但不能执行(第一组rw-,分别对应读、写、执行);用户组可读、写文件,但不能执行(第二组rw-,分别对应读、写、执行);其他所有用户可读该文件,但不能写或者执行(最后的r--)。 改变文件属性:chmod <mode> <file> # 改变文件属性。一个常见的用法是,写了一个脚本文件my_tool.sh后,默认的文件属性并不能执行文件,可以用下面的命令允许执行该文件:
命令里的+x表示允许执行,可以看到,文件所属用户、文件所属组和所有用户都可以执行这个文件了。 创建文件夹:mkdir <folder> # 在当前工作目录下创建文件夹folder。folder也可以是绝对路径。 删除文件夹:rmdir <folder> # 删除文件夹folder。必须是空的文件夹。如果要删除整个文件夹,使用rm -rf <folder>命令。其中-r表示recursive,-f表示force。慎用。 |
alias cp=
'cp -i'
alias rm=
'rm -i'
alias mv=
'mv -i'
|
用下面的命令查看文件内容。
cat | 查看文件:cat <file> # 查看文件file的内容。 | |
head | 看文件的前面若干行:head -n <file> # 查看文件file的前n行。 | |
tail | 看文件的最后若干行: tail -n <file> # 查看文件file的最后n行。 如果一个文件(比如日志文件)正在不停地在文件尾部增加内容,可以用这个命令实时地看新加进的内容:tail -f foo.log 这里f表示follow。 | |
more less | 有时文件太长,可以使用more或者less命令来分页看文件内容, 一般比用vim打开更快: more [file] # 分页看file内容。按空格翻一页;按回车翻一行。 less [file] # 分页看file内容。less是more的升级版,支持一些类vi的快捷键、翻页、搜索等等,基本可以alias more=‘less’ | |
diff |
对比两个文件的内容:diff file1 file2
另外, vimdff file1 file2 提供了一种更加交互更加友好的diff展现方式.请自行在上面例子中用vimdiff比较, 观察vimdiff的效果. |
如果想了解文件概况,用下面的命令。
wc | wc file # 得到文件有多少行、多少个词、和总共多少个字节。 |
md5sum | md5sum file # 得到文件的md5码。 # md5文件的一个"特征值". 如果两个文件md5相同, 一般可以认为两个文件相同. # 可以用来比较两个应该相同的文件是不是确实相同.(如拷贝数据之后) |
用下面命令来对文件内容进行操作。
cut |
$ printf "3\ta\tb\n1\tc\td\n2\te\tf\n" > /tmp/1.tmp # 产生如下的文件
只显示文件的第1列和第3列:
如果使用-b参数,指定的列是按照字节来计算的:
| |||
sort |
对文件的所有行按照字典序排序:
其他常见用法:
| |||
uniq |
如果文件的相邻行可能会相同,用uniq命令显示不相同的行。如果相同的行不相邻,都会保留。
调用uniq之前,常常会先调用sort,因为uniq只对相邻的行去掉重复。比如:
| |||
grep |
用grep命令查找文件中的特定字串:
其他常见用法:
| |||
sed |
sed是一个对文件内容进行逐行修改的工具。
下面是输出文件内容时把所有包含”C++”的行去掉:
| |||
awk |
awk包括了一个完整的脚本语言,有强大的文本处理能力。这里举两个简单例子:
出第1列的平均:
| |||
shuf |
文件基于行随机shuffle
| |||
rev |
把文件每行都左右反转
| |||
tr |
可以做字符替换。
| |||
tar |
归档/压缩/解压工具。
|
sed和awk的功能非常强大,上面的例子不能表达万分之一。有兴趣的同学可以参考下面两个页面:
htop | 可以看到各个进程的实时CPU占用率、内存使用,进程ID,命令行,启动时间,用户等信息。还有机器整体的CPU占用率和内存使用情况。 最重点需要观察的是: CPU占用率是否符合预期? 内存占用率是否符合预期? 最占CPU/内存的进程是什么, 是否符合预期? 其中 F4 可以筛选想看的进程. F9可以直接杀死想杀死的进程. | |
top | 弱化版的htop。仅在系统没有安装htop的时候才推荐使用。 | |
ps |
ps提供当前各个进程状态的snapshot。ps的参数组合比较复杂,这里列举两个:
| |
dstat | 系统资源统计。可以查看每秒的CPU,磁盘读写,网络出入等信息。 | |
netstat |
网络详细信息。
| |
nvidia-smi |
查看GPU的状态。
| |
ssh |
登陆远程机器。之后你可以在远程机器上键入命令执行。
| |
scp |
在机器之间复制文件。
| |
rsync |
和scp接近,文件传输工具。特别适用于大量小文件场合,此时速度会明显快于scp。
| |
ctrl c kill killall pkill |
我们能够对程序发送不同的signal(信号). 不同的signal程序会做不同的相应. 既可以使用键盘快捷键发送信号, 也可以使用 kill 命令来发送. ctrl c给程序发 sigint 信号, 一般导致的行为是程序做一些cleanup后"优雅"退出. ctrl c 等价于 kill -2 <PID> 或者 kill -SIGINT <PID>. kill <PID> 等价于 kill -TERM <PID>, 是一种比 -SIGINT 更加暴力的信号.用于杀死进程。 信号本身内容较复杂. 新手仅需要记住按照先 ctrl c 不行再 kill 的顺序杀死进程即可.
供参考: | |
后台运行相关 |
| |
proc文件系统 |
/proc/ 下面, 可以得到很多机器和进程信息.
|
date |
显示当前时间.
| |
wget |
下载工具
| |
xargs |
把从标准输入读入的每行或每若干行,都执行特定的命令。用好之后是非常灵活强大的必备工具。下面展示几种样例用法
| |
jq |
可以用来解析json。
| |
parallel |
用于并行执行多个相近的命令。
| |
convert |
非常强大的图片处理工具
| |
time |
统计一个命令运行的时间
| |
修改 ~/.bashrc | vim ~/.bashrc (注意那个点!) 可以看目前用户的bash配置文件 每个运行中的bash在启动时都会执行一遍这里面的命令. 常见的用途是, 在 ~/.bashrc 里面 用 export 来设置一些环境变量, 如 PATH LD_LIBRARY_PATH, 或者做一些命令的别名. 如 alias grep='grep --color'等 | |
history | 显示过去一段时间用户输入过的命令. history | grep mkdir # 显示我过去的带"mkdir"的命令 |
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。