1. 学会使用命令帮助
1.1. 概述
1.2. 命令使用
查看命令的简要说明
使用man
查看路径
总结
2. 文件及目录管理
2.1. 创建和删除
2.2. 目录切换
2.3. 列出目录项
2.4. 查找目录及文件 find/locate
2.5. 查看文件内容
2.6. 查找文件内容
2.7. 文件与目录权限修改
2.8. 给文件增加别名
2.9. 管道和重定向
2.10. 设置环境变量
2.11. bash快捷输入或删除
2.12. 综合应用
2.13. 总结
3. 文本处理
3.1. find 文件查找
定制搜索
找到后的后续动作
-print的定界符
3.2. grep 文本搜索
3.3. xargs 命令行参数转换
3.4. sort 排序
3.5. uniq 消除重复行
3.6. 用tr进行转换
3.7. cut 按列切分文本
3.8. paste 按列拼接文本
3.9. wc 统计行和字符的工具
3.10. sed 文本替换利器
3.11. awk 数据流处理工具
print 打印当前行
特殊变量: nr nf $0 $1 $2
传递外部变量
用样式对awk处理的行进行过滤
设置定界符
读取命令输出
在awk中使用循环
awk结合grep找到指定的服务,然后将其kill掉
awk实现head、tail命令
打印指定列
打印指定文本区域
awk常用内建函数
3.12. 迭代文件中的行、单词和字符
1. 迭代文件中的每一行
2.迭代一行中的每一个单词
3. 迭代每一个字符
4. 磁盘管理
4.1. 查看磁盘空间
4.2. 打包/ 压缩
4.3. 解包/解压缩
4.4. 总结
5. 进程管理工具
5.1. 查询进程
5.2. 终止进程
5.3. 进程监控
5.4. 分析线程栈
5.5. 综合运用
5.6. 总结
6. 性能监控
6.1. 监控cpu
6.2. 查询内存
6.3. 查询页面交换
6.4. 查询硬盘使用
6.5. 综合应用
6.6. 总结
7. 网络工具
7.1. 查询网络服务和端口
7.2. 网络路由
7.3. 镜像下载
7.4. ftp sftp lftp ssh
7.5. 网络复制
7.6. 总结
8. 用户管理工具
8.1. 用户
添加用户
删除用户
8.2. 用户的组
将用户加入到组
查看系统所有组
8.3. 用户权限
更改读写权限
更改文件或目录的拥有者
8.4. 环境变量
8.5. 总结
9. 系统管理及ipc资源管理
9.1. 系统管理
查询系统版本
查询硬件信息
设置系统时间
9.2. ipc资源管理
ipc资源查询
检测和设置系统资源限制
9.3. 总结
在linux终端,面对命令不知道怎么用,或不记得命令的拼写及参数时,我们需要求助于系统的帮助文档; linux系统内置的帮助文档很详细,通常能解决我们的问题,我们需要掌握如何正确的去使用它们;
在只记得部分命令关键字的场合,我们可通过man -k来搜索;
需要知道某个命令的简要说明,可以使用whatis;而更详细的介绍,则可用info命令;
查看命令在哪个位置,我们需要使用which;
而对于命令的具体参数及使用方法,我们需要用到强大的man;
下面介绍这些命令;
简要说明命令的作用(显示命令所处的man分类页面):
正则匹配:
更加详细的说明文档:
查询命令command的说明文档:
使用page up和page down来上下翻页
在man的帮助手册中,将帮助文档分为了9个类别,对于有的关键字可能存在多个类别中, 我们就需要指定特定的类别来查看;(一般我们查询bash命令,归类在1类中);
man页面所属的分类标识(常用的是分类1和分类3)
前面说到使用whatis会显示命令所在的具体的文档类别,我们学习如何使用它
我们看到printf在分类1和分类3中都有;分类1中的页面是命令操作及可执行文件的帮助;而3是常用函数库说明;如果我们想看的是c语言中printf的用法,可以指定查看分类3的帮助:
查询关键字 根据命令中部分关键字来查询命令,适用于只记住部分命令的场合;
eg:查找gnome的config配置工具命令:
对于某个单词搜索,可直接使用/word来使用: /-a; 多关注下see also 可看到更多精彩内容
查看程序的binary文件所在路径:
eg:查找make程序安装路径:
查看程序的搜索路径:
当系统中安装了同一软件的多个版本时,不确定使用的是哪个版本时,这个命令就能派上用场;
whatis info man which whereis
文件管理不外乎文件或目录的创建、删除、查询、移动,有mkdir/rm/mv
文件查询是重点,用find来进行查询;find的参数丰富,也非常强大;
查看文件内容是个大的话题,文本的处理有太多的工具供我们使用,在本章中只是点到即止,后面会有专门的一章来介绍文本的处理工具;
有时候,需要给文件创建一个别名,我们需要用到ln,使用这个别名和使用原文件是相同的效果;
创建:mkdir
删除:rm
删除非空目录:rm -rf file目录
删除日志 rm *log (等价: $find ./ -name “*log” -exec rm {} ????
移动:mv
复制:cp (复制目录:cp -r )
查看当前目录下文件个数:
复制目录:
找到文件/目录位置:cd
切换到上一个工作目录: cd -
切换到home目录: cd or cd ~
显示当前路径: pwd
更改当前工作路径为path: $cd path
显示当前目录下的文件 ls
按时间排序,以列表的方式显示目录项 ls -lrt
以上这个命令用到的频率如此之高,以至于我们需要为它建立一个快捷命令方式:
在.bashrc 中设置命令别名:
这样,使用lsl,就可以显示目录中的文件按照修改时间排序;以列表方式显示;
给每项文件前面增加一个id编号(看上去更加整洁):
1 a 2 a.out 3 app 4 b 5 bin 6 config
注:.bashrc 在/home/你的用户名/ 文件夹下,以隐藏文件的方式存储;可使用 ls -a 查看;
搜寻文件或目录:
查找目标文件夹中是否有obj文件:
递归当前目录及子目录删除所有.o文件:
find是实时查找,如果需要更快的查询,可试试locate;locate会为文件系统建立索引数据库,如果有文件更新,需要定期执行更新命令来更新索引库:
寻找包含有string的路径:
与find不同,locate并不是实时查找。你需要更新数据库,以获得最新的文件索引信息。
查看文件:cat vi head tail more
显示时同时显示行号:
按页显示列表内容:
只看前10行:
显示文件第一行:
显示文件倒数第五行:
查看两个文件间的差别:
动态显示文本最新信息:
使用egrep查询文件内容:
改变文件的拥有者 chown
改变文件读、写、执行等属性 chmod
递归子目录修改: chown -r tuxapp source/
增加脚本可执行权限: chmod a+x myscript
创建符号链接/硬链接:
批处理命令连接执行,使用 |
串联: 使用分号 ;
前面成功,则执行后面一条,否则,不执行:&&
前面失败,则后一条执行: ||
能够提示命名是否执行成功or失败;
与上述相同效果的是:
重定向:
等价的是:
清空文件:
启动帐号后自动执行的是 文件为 .profile,然后通过这个文件可设置自己的环境变量;
安装的软件路径一般需要加入到path中:
快捷键:
查找record.log中包含aaa,但不包含bbb的记录的总数:
文件管理,目录的创建、删除、查询、管理: mkdir rm mv
文件的查询和检索: find locate
查看文件内容:cat vi tail more
管道和重定向: ; | && >
本节将介绍linux下使用shell处理文本时最常用的工具: find、grep、xargs、sort、uniq、tr、cut、paste、wc、sed、awk; 提供的例子和参数都是常用的; 我对shell脚本使用的原则是命令单行书写,尽量不要超过2行; 如果有更为复杂的任务需求,还是考虑python吧;
查找txt和pdf文件:
正则方式查找.txt和pdf:
-iregex: 忽略大小写的正则
否定参数 ,查找所有非txt文本:
指定搜索深度,打印出当前目录的文件(深度为1):
按类型搜索
-type f 文件 / l 符号链接 / d 目录
find支持的文件检索类型可以区分普通文件和符号链接、目录等,但是二进制文件和文本文件无法直接通过find的类型区分出来;
file命令可以检查文件具体类型(二进制或文本):
所以,可以用以下命令组合来实现查找本地目录下的所有二进制文件:
按时间搜索
-atime 访问时间 (单位是天,分钟单位则是-amin,以下类似)-mtime 修改时间 (内容被修改)-ctime 变化时间 (元数据或权限变化)
最近第7天被访问过的所有文件:
最近7天内被访问过的所有文件:
查询7天前被访问过的所有文件:
按大小搜索:
w字 k m g 寻找大于2k的文件:
按权限查找:
按用户查找:
删除
删除当前目录下所有的swp文件:
另一种语法:
执行动作(强大的exec)
将当前目录下的所有权变更为weber:
注:{}是一个特殊的字符串,对于每一个匹配的文件,{}会被替换成相应的文件名;
将找到的文件全都copy到另一个目录:
结合多个命令
如果需要后续执行多个命令,可以将多个命令写成一个脚本。然后 -exec 调用时执行脚本即可:
默认使用’\n’作为文件的定界符;
-print0 使用’\0’作为文件的定界符,这样就可以搜索包含空格的文件;
常用参数
-o 只输出匹配的文本行 vs -v 只输出没有匹配的文本行
-c 统计文件中包含文本的次数
grep -c “text” filename
-n 打印匹配的行号
-i 搜索时忽略大小写
-l 只打印文件名
在多级目录中对文本递归搜索(程序员搜代码的最爱):
匹配多个模式:
grep输出以0作为结尾符的文件名(-z):
综合应用:将日志中的所有带where条件的sql查找查找出来:
查找中文示例:工程目录中utf-8格式和gb2312格式两种文件,要查找字的是中文;
查找到它的utf-8编码和gb2312编码分别是e4b8ade69687和d6d0cec4
查询:
汉字编码查询:http://bm.kdd.cc/
xargs 能够将输入数据转化为特定命令的命令行参数;这样,可以配合很多命令来组合使用。比如grep,比如find; - 将多行输出转化为单行输出
n 是多行文本间的定界符
将单行转化为多行输出
-n:指定每行显示的字段数
xargs参数说明
-d 定义定界符 (默认为空格 多行的定界符为 n)
-n 指定输出为多行
-i {} 指定替换字符串,这个字符串在xargs扩展时会被替换掉,用于待执行的命令需要多个参数时
-0:指定0为输入定界符
示例:
字段说明
-n 按数字进行排序 vs -d 按字典序进行排序
-r 逆序排序
-k n 指定按第n列排序
消除重复行
统计各行在文件中出现的次数
找出重复行
可指定每行中需要比较的重复内容:-s 开始位置 -w 比较字符数
通用用法
tr删除字符
-c 求补集
tr压缩字符
tr -s 压缩文本中出现的重复字符;最常用于压缩多余的空格:
字符类
tr中可用各种字符类:
alnum:字母和数字alpha:字母digit:数字space:空白字符lower:小写upper:大写cntrl:控制(非可打印)字符print:可打印字符
使用方法:tr [:class:] [:class:]
截取文件的第2列和第4列
去文件除第3列的所有列
-d 指定定界符
cut 取的范围
n- 第n个字段到结尾-m 第1个字段为mn-m n到m个字段
cut 取的单位
-b 以字节为单位-c 以字符为单位-f 以字段为单位(使用定界符)
截取文本的第5到第7列
将两个文本按列拼接到一起;
默认的定界符是制表符,可以用-d指明定界符:
首处替换
全局替换
默认替换后,输出替换后的内容,如果需要直接替换原文件,使用-i:
移除空白行
变量转换
已匹配的字符串通过标记&来引用.
子串匹配标记
第一个匹配的括号内容使用标记 1 来引用
双引号求值
sed通常用单引号来引用;也可使用双引号,使用双引号后,双引号会对表达式求值:
当使用双引号时,我们可以在sed样式和替换字符串中指定变量;
其它示例
字符串插入字符:将文本中每行内容(abcdef) 转换为 abc/def:
awk脚本结构
工作方式
1.执行begin中语句块;
2.从文件或stdin中读入一行,然后执行statements2,重复这个过程,直到文件全部被读取完毕;
3.执行end语句块;
使用不带参数的print时,会打印当前行
print 以逗号分割时,参数以空格定界;
使用-拼接符的方式(”“作为拼接符);
nr:表示记录数量,在执行过程中对应当前行号;
nf:表示字段数量,在执行过程总对应当前行的字段数;
$0:这个变量包含执行过程中当前行的文本内容;
$1:第一个字段的文本内容;
$2:第二个字段的文本内容;
打印每一行的第二和第三个字段
统计文件的行数
累加每一行的第一个字段
使用-f来设置定界符(默认为空格):
使用getline,将外部shell命令的输出读入到变量cmdout中:
eg:以下字符串,打印出其中的时间串:
而如果需要将后面的部分也打印出来(时间部分和后文分开打印):
以逆序的形式打印行:(tac命令的实现):
head
tail
awk方式实现
cut方式实现
确定行号
确定文本
打印处于start_pattern 和end_pattern之间的文本:
index(string,search_string):返回search_string在string中出现的位置
sub(regex,replacement_str,string):将正则匹配到的第一处内容替换为replacement_str;
match(regex,string):检查正则表达式是否能够匹配字符串;
length(string):返回字符串长度
printf 类似c语言中的printf,对输出进行格式化:
while 循环法
awk法
${string:start_pos:num_of_chars}:从字符串中提取一个字符;(bash文本切片)
${#word}:返回变量word的长度
以ascii字符显示文件:
日程磁盘管理中,我们最常用的有查看当前磁盘使用情况,查看当前目录所占大小,以及打包压缩与解压缩;
查看磁盘空间利用大小:
-h: human缩写,以易读的方式显示结果(即带单位:比如m/g,如果不加这个参数,显示的数字以b为单位)
查看当前目录所占空间大小:
-h 人性化显示
-s 递归整个目录的大小
查看当前目录下所有子文件夹排序后的大小:
在linux中打包和压缩和分两步来实现的;
打包
打包是将多个文件归并到一个文件:
-c :打包选项
-v :显示打包进度
-f :使用档案文件
注:有的系统中指定参数时不需要在前面加上-,直接使用tar xvf
示例:用tar实现文件夹同步,排除部分文件不同步:
压缩
生成 demo.txt.gz
解包
-x 解包选项
解压后缀为 .tar.gz的文件 1. 先解压缩,生成**.tar:
解包:
bz2解压:
如果tar 不支持j,则同样需要分两步来解包解压缩,使用bzip2来解压,再使用tar解包:
-d decompose,解压缩
tar解压参数说明:
-z 解压gz文件
-j 解压bz2文件
-j 解压xz文件
查看磁盘空间 df -h
查看目录大小 du -sh
打包 tar -cvf
解包 tar -xvf
压缩 gzip
解压缩 gunzip bzip
这一节我们介绍进程管理工具;
使用进程管理工具,我们可以查询程序当前的运行状态,或终止一个进程;
任何进程都与文件关联;我们会用到lsof工具(list opened files),作用是列举系统中已经被打开的文件。在linux环境中,任何事物都是文件,设备是文件,目录是文件,甚至sockets也是文件。用好lsof命令,对日常的linux管理非常有帮助。
查询正在运行的进程信息
eg:查询归属于用户colin115的进程
查询进程id(适合只记得部分进程字段)
以完整的格式显示所有的进程
显示进程信息,并实时更新
查看端口占用的进程状态:
查看用户username的进程所打开的文件
查询init进程当前打开的文件
查询指定的进程id(23295)打开的文件:
查询指定目录下被进程开启的文件(使用+d 递归目录):
杀死指定pid的进程 (pid为process id)
杀死相关进程
杀死job工作 (job为job number)
查看系统中使用cpu、使用内存最多的进程;
输入top命令后,进入到交互界面;接着输入字符命令后显示相应的进程状态:
对于进程,平时我们最常想知道的就是哪些进程占用cpu最多,占用内存最多。以下两个命令就可以满足要求:
这里介绍最使用的几个选项,对于更详细的使用,详见 top linux下的任务管理器 ;
使用命令pmap,来输出进程内存的状况,可以用来分析线程堆栈;
将用户colin115下的所有进程名以av_开头的进程终止:
将用户colin115下所有进程名中包含host的进程终止:
ps top lsof kill pmap
在使用操作系统的过程中,我们经常需要查看当前的性能如何,需要了解cpu、内存和硬盘的使用情况; 本节介绍的这几个工具能满足日常工作要求;
查看cpu使用率
后面的两个参数表示监控的频率,比如例子中的1和2,表示每秒采样一次,总共采样2次;
查看cpu平均负载
sar指定-q后,就能查看运行队列中的进程数、系统上的进程大小、平均负载等;
查看内存使用状况 sar指定-r之后,可查看内存使用状况;
查看内存使用量
查看页面交换发生状况 页面发生交换时,服务器的吞吐量会大幅下降;服务器状况不良时,如果怀疑因为内存不足而导致了页面交换的发生,可以使用sar -w这个命令来确认是否发生了大量的交换;
查看磁盘空间利用情况
查询当前目录下空间使用情况
查看该目录下所有文件夹的排序后的大小
当系统中sar不可用时,可以使用以下工具替代:linux下有 vmstat、unix系统有prstat
eg: 查看cpu、内存、使用情况: vmstat n m (n 为监控频率、m为监控次数)
使用watch 工具监控变化 当需要持续的监控应用的某个数据变化时,watch工具能满足要求; 执行watch命令后,会进入到一个界面,输出当前被监控的数据,一旦数据变化,便会高亮显示变化情况;
eg:操作redis时,监控内存变化:
top / sar / free / watch
netstat 命令用于显示各种网络相关信息,如网络连接,路由表,接口状态 (interface statistics),masquerade 连接,多播成员 (multicast memberships) 等等。
列出所有端口 (包括监听和未监听的):
列出所有 tcp 端口:
列出所有有监听的服务状态:
使用netstat工具查询端口:
lsof(list open files)是一个列出当前系统打开文件的工具。在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。所以如传输控制协议 (tcp) 和用户数据报协议 (udp) 套接字等; 在查询网络端口时,经常会用到这个工具。
查询7902端口现在运行什么程序:
注解
以上介绍lsof关于网络方面的应用,这个工具非常强大,需要好好掌握,详见 lsof 一切皆文件 ;
查看路由状态:
发送ping包到地址ip:
探测前往地址ip的路由路径:
dns查询,寻找域名domain对应的ip:
反向dns查询:
直接下载文件或者网页:
常用选项:
–limit-rate :下载限速
-o:指定日志文件;输出都写入日志;
-c:断点续传
ssh登陆:
ssh登陆远程服务器host,id为用户名。
ftp/sftp文件传输:
登陆服务器host,id为用户名。sftp登陆后,可以使用下面的命令进一步操作:
get filename # 下载文件
put filename # 上传文件
ls # 列出host上当前路径的所有文件
cd # 在host上更改当前路径
lls # 列出本地主机上当前路径的所有文件
lcd # 在本地主机更改当前路径
lftp同步文件夹(类似rsync工具):
将本地localpath指向的文件上传到远程主机的path路径:
以ssh协议,遍历下载path路径下的整个文件系统,到本地的localpath:
netstat lsof route ping host wget sftp scp
该命令为用户创建相应的帐号和用户目录/home/username;
用户添加之后,设置密码:
密码以交互方式创建:
不带选项使用 userdel,只会删除用户。用户的家目录将仍会在/home目录下。要完全的删除用户信息,使用-r选项;
帐号切换 登录帐号为usera用户状态下,切换到userb用户帐号工作:
进入交互模型,输入密码授权进入;
默认情况下,添加用户操作也会相应的增加一个同名的组,用户属于同名组; 查看当前用户所属的组:
一个用户可以属于多个组,将用户加入到组:
变更用户所属的根组(将用加入到新的组,并从原有的组中除去):
系统的所有用户及所有组信息分别记录在两个文件中:/etc/passwd , /etc/group 默认情况下这两个文件对所有用户可读:
查看所有用户及权限:
查看所有的用户组及权限:
使用ls -l可查看文件的属性字段,文件属性字段总共有10个字母组成,第一个字母表示文件类型,如果这个字母是一个减号”-”,则说明该文件是一个普通文件。字母”d”表示该文件是一个目录,字母”d”,是dirtectory(目录)的缩写。 后面的9个字母为该文件的权限标识,3个为一组,分别表示文件所属用户、用户所在组、其它用户的读写和执行权限; 例如:
表示这个文件对文件拥有者colin这个用户可读写、可执行;对colin所在的组(king)可读可写;对其它用户只可读;
使用chmod命令更改文件的读写权限,更改读写权限有两种方法,一种是字母方式,一种是数字方式
字母方式:
usermark取值:
u:用户
g:组
o:其它用户
a:所有用户
permissionsmark取值:
r:读
w:写
x:执行
例如:
数字方式:
数字方式直接设置所有权限,相比字母方式,更加简洁方便;
使用三位八进制数字的形式来表示权限,第一位指定属主的权限,第二位指定组权限,第三位指定其他用户的权限,每位通过4(读)、2(写)、1(执行)三种数值的和来确定权限。如6(4+2)代表有读写权,7(4+2+1)有读、写和执行的权限。
使用-r选项递归更改该目下所有文件的拥有者:
bashrc与profile都用于保存用户的环境信息,bashrc用于交互式non-loginshell,而profile用于交互式login shell。
/etc/profile,/etc/bashrc 是系统全局环境变量设定
/.profile,/.bashrc用户目录下的私有环境变量设定
当登入系统获得一个shell进程时,其读取环境设置脚本分为三步:
首先读入的是全局环境变量设置文件/etc/profile,然后根据其内容读取额外的文档,如/etc/profile.d和/etc/inputrc
读取当前登录用户home目录下的文件/.bash_profile,其次读取/.bash_login,最后读取~/.profile,这三个文档设定基本上是一样的,读取有优先关系
读取~/.bashrc
/.profile与/.bashrc的区别:
这两者都具有个性化定制功能
~/.profile可以设定本用户专有的路径,环境变量,等,它只能登入的时候执行一次
~/.bashrc也是某用户专有设定文档,可以设定路径,命令别名,每次shell script的执行都会使用它一次
例如,我们可以在这些环境变量中设置自己经常进入的文件路径,以及命令的快捷方式:
通过上述设置,我们进入log目录就只需要输入cd $log即可;
useradd passwd userdel usermod chmod chown .bashrc .bash_profile
查看linux系统版本:
查看unix系统版本:操作系统版本:
查看cpu使用情况:
查询cpu信息:
查看cpu的核的个数:
查看内存信息:
显示内存page大小(以kbyte为单位):
显示架构:
显示当前系统时间:
设置系统日期和时间(格式为2014-09-15 17:05:00):
设置时区:
强制把系统时间写入cmos(这样,重启后时间也正确了):
警告
设置系统时间需要root用户权限.
格式化输出当前日期时间:
查看系统使用的ipc资源:
查看系统使用的ipc共享内存资源:
查看系统使用的ipc队列资源:
查看系统使用的ipc信号量资源:
应用示例:查看ipc资源被谁占用
有个ipckey:51036 ,需要查询其是否被占用;
首先通过计算器将其转为十六进制:
51036 -> c75c
如果知道是被共享内存占用:
如果不确定,则直接查找:
显示当前所有的系统资源limit 信息:
对生成的 core 文件的大小不进行限制:
uname sar arch date ipcs ulimit