命令格式: [选项] [选项参数] ... [参数]
按照英语语系语法: 主谓宾 、 定状补、 命令省略主语命令主体: 谓语动词;
[选项] :命令执行的方式,一般以 -- 或 - 开始
[参数] : 宾语, 是该命令要处理或修改的事物;
注意点: 命令中 空格 作为各个参数之间分隔符;
关于命令中选项 与 选项参数;
linux cmd中很多选项都是单词首字母,例如h, 有可能help, human-readable, header
human-readable:
header:
通配符:
? : 单个字符 * : 几个任意字符 [charlist] : 匹配字符列表中任意单一字符 [^charlist] : 不在字符列表中任意单一字符 [c1-c2] : 匹配字母序或数字C1 到 C2 之间任意单个字符 (str1|str2) : 匹配列表中任意一个字符串 <num1-num2> : 匹配任何在num1 至 num2 之间数字,缺省为0 ~ 无穷大;
任务管理:
Ctrl+c : 结束当前程序/命令;
ctrl+z : 命令挂起,暂停命令执行
jobs : 查看后台执行的和 挂起的任务及任务编号;
bg : 将挂起命令后台执行;如果存在多个挂起命令,根据上面jobs 得到的任务编号,可以指定任务后台执行; bg %3
fg : 将挂起或后台执行的命令,变为前台运行; 如果存在多个挂起命令,根据上面jobs 得到的任务编号,可以指定任务后台执行; fg %3
& :加在命令后表示后台运行;
; :加在命令后表示顺序执行;
&& :连接 2 个命令后表示与,前面执行成功才会执行后面命令;
|| :连接2 个命令后表示或,如果前面成功就不执行后面命令;
`` : 命令替换符,表示命令中如果包含另一个命令,用``包括的命令将会优先执行; ls `echo /`
体会下 ||, &&,以及experession 在 []中的表示:
A=123 [ -n ${A} ] && ([ "${A}" -lt 100 ] || echo "too big" )
输入&输出重定向:
> : 重定向符号,从命令到文件的重定向 >> : 追加符号,从命令到文件的追加 < :重定向符号,从文件到命令的重定向 << : 自定义结束符号的重定向,后续输入的字符以<< 后面定义的字符为结束标志;
管道: |, 将管道符号做边的命令的标注输出,作为管道符号右边命令的标准输入;
实际应用中要把命名管道文件重定向到需求的对象,当管道中有数据时候,就会直接传送过去;
还有匿名管道,直接将结果传递给下一个对象;
转义字符:
\ :反斜杠,转义,去除其后紧跟的元字符 或通配符的特殊意义 '' :硬转义,硬引用,其内部所有的shell元字符,通配符都会被关掉; 注意 硬转义中不允许出现`` "" :软转义,软引,其内部只允许特定的shell 元字符; $ 用于变量替换,` 用于命令替换, \ 用于转义单个字符;
系统信息相关命令:
alias : 命令别名, 可以将常用命令简略化 alias a1="ssh a1" ,退出后别名会消失;如果想要永久保存,可以把命令存在.zshrc 类的resource 文件中。 passwd : 配置密码相关设定(删除密码,锁账户,设定密码时效...),缺省值是当前用户,否则是指定用户; 返回值 对应不同含义 -d : delete 删除密码 -e : expire 密码过期 -l : lock 锁密码; last :显示最近一月用户登陆信息; -f <file>: 指定记录文件; 其中/var/log/wtmp :成功登陆用户信息文件; btmp,btmp1:失败用户登陆信息; lastlog : 打印每个帐号的最近登陆时间; uname :打印当前系统信息, Unix name; cat /etc/os-release : OS release 版本信息; uptime : 系统运行市场 和 平均负载; -p :(pretty) 以漂亮方式显示; -s :(since) 系统启动时间 -V :(version)版本信息 w :当前用户列表及正在执行的任务
id : 查看用户与组信息 su - username : 切换用户,其中 - 模拟重新登陆过程; who :显示当前登陆系统的用户信息 who am i: 只显示当前terminal用户,有些解释器没有这个命令 whoami :当前用户
date :显示或设置系统时间日期 cal :日历 write :将信息发送到指定的登陆用户终端 信息接受打开/关闭 : mesg y/n wall :write all 给所有人发信息;比如要关机重启通知所有登陆用户;
man : manual帮助文档 man -k cmd ; 包含关键子cmd 字符的所有cmd man -f cmd: 完全匹配cmd 字符的cmd man 3 printf ; 进入第3 章节中的printf; 在文本编辑器中,K(3 + K) 可以跳入对应的解释文件;
目录/文件的基本操作:
cd : change dir(切换工作目录) cd .. : #切换到上层目录 cd : #切换到当前用户家目录 cd ~ : #切换到当前用户家目录 cd - : #切换到上次工作目录 pwd : print working dir 打印当前目录 -L : logic 逻辑地址 -P : phycis 物理地址 EXAMPLE: 下面的run 文件夹是link 类型,对于不同pwd 参数返回就不同
tree : 树状格式打印 -L : 打印到第几层,当前为第一层; -d : dir only, 只打印文件夹 -s : size, 显示大小 -h : human-readable size显示,方便阅读 ls :list 列出当前目录下文件,其中时间默认是mtime -a : all 所有文件 -S : size 按size 降序排列 -i : --inode, 打印出每个文件的index, 同一个文件有相同的index(主要针对软/硬链接) --time=atime/ctime/mtime : 指定显示的时间类型 文件: 可读:可以读取文件里的数据 可写: 可以改变和删除文件 可执行:可以执行该程序 文件夹: 可读:可以列出目录中有什么文件(只有名字 和 类型) 可写: 可以在目录中删除和增加文件 可执行:可以列出目录下文件信息,进入目录
lsattr : 文件隐藏属性 -a : all 打印隐藏文件属性 -R : recursively 递归 -d : dir 如果是目录,仅打印目录 chattr: change 修改文件的隐藏属性, + : 增加,- : remove, = : 完全等于当前attr; 有这些选项'aAcCdDeFijPsStTu', 下面举例了一些; A : no atime update 不修改atime S : synchonous 同步写入 a : append 只能增加数据 c : compressed 自动压缩,解压 d : no dump 不会被dump程序备份 i : immutable 不能删除,修改,建立链接 s : secure deletion 文件删除时,直接从磁盘删除 u : undeletable 文件删除时,数据内容存在磁盘中
mkdir : 创建目录 -p : parents 多层文件目录建立时,父层文件夹没有时,自动建立 -m :mode 文件夹权限; mkdir -m 700 files rmdir : 删除目录 -p : 多层目录时候,同时删除父文件夹;如果父文件夹不为空,到不为空文件夹删除时候会fail, rmdir -p a/b/c/d/e rm : 删除文件/目录; 此时只是将物理位置移除链接。 -i : 互动模式 -r : recursively, 如果有递归,则递归删除文件夹下所有的文件&文件夹; -f : 不询问,直接删除; mv : move 移动文件; cp : copy 拷贝文件 -r : recusively, 递归复制 -p : perserve 连同文件属性一起拷贝,mode, ownership, timestamp; -d : 若源文件为link 属性,则复制link 属性 -a : archive 上面rpd 的要求都包含; -l : link 拷贝为硬链接,类似于C++ 中的别名 -s : soft 拷贝为软链接,新建一个文件,类似超链接 -u : update 源文件比目的文件要新,或目的文件不存在时候才更新; -i : interactive, 覆盖前询问(prompt) EXAMPLE: 下面展示了软/硬链接差别,硬链接是同一个文件,因为inode值一样,软链接是新文件。也可以注意文件前面的链接数; 但是更改这3个文件任一个,其他文件都跟着更新; 注意软链接时间戳为建立时间,即使源文件更新了。
文件内容增查改删:主要针对ASCII 编码文件
od : 以二进制方式查看文件; cat : 正向连续输出 -A : 相当于-vET -b : number-nonblank 列出行号 -n : number 列出行号,包含空行 tac : 反向连续读; nl : 输出行号, 等价 cat -b -b : 行号指定方式 -b a : 相当于 cat -n -b t : 相当于cat -b -b p : 只对满足正则表达式记行号, nl -b pSoft file #只对包含Soft行统计行号; -n : 列出行号的表示方法 -n ln : left number 行号在屏幕最左边 -n rn : right number 行号在屏幕最右边 -n rz : right + zero 最左边显示,补齐位用0 -w <NUM> : 行号所占位数 EXAMPLE: nl -b por -n rz man -w 20
more : 一页一页的显示文件内容, 进入查看文件后,可以有下面操作; /string : 向下查找string 关键字 :f : 显示文件名 和 当前显示行数; ? : 查看其他命令 less : 与more 类似,功能更多, 进入查看文件后,可以有下面操作; /string : 向下查找string 关键字 ?string : 反向查找string 关键字 n : 继续向下查找 N : 继续反向查找 q : 退出 head : 只看前面几行 -n xx : 查看前xx 行数 -n -xx: 最后xx行不显示 tail : 末尾几行 -n num : 显示后num 行; -n +num : 除了前num - 1 行,其他都显示 touch : 修改文件时间与新建文件,默认ACM 时间都会修改 -a : access time 仅修改访问时间 -c : no-create 仅修改文件的时间,如不存在,不新建 -m : modify 仅修改mtime -d : date 修改文件日期 -t :time 修改文件时间[yymmddhhmm] stat : 显示文件的状态,包含大小,位置,ACM time等等; -c : control, 控制输出内容; stat -c "%s %n" a.a
chmod :更改文件权限 chmod a+x file #给file 文件UGO 都赋予执行权限 chmod o-x file #将file 文件other 减去执行权限 chmod 755 file #设置file文件权限 rwxr-xr-x chmod u=rwx,go=rx file #设置file文件的权限 rwxr-xr-x chmod u+/-S file 或 chmod 4755 file 方式更改文件隐藏权限;这里一共4为权限位,第一个4 就是代表下面的SUID/SGID/SBIT 权限位; 修改文件的隐藏属性 SUID: set_uid 4 二进制程序文件,非脚本; 用户在使用命令时候获取所属者的权限 SGID: set_gid 2 目录与二进制文件,用户在该目录,有效组变为目录所属组 SBIT: sticky bit 1 在该目录下,用户只能删除自己创建的内容; sudo 用户组可以突破这个限制;
chown #更改文件所属用户 chown user:group file #修改文件file的所属用户是user,所属组为group chown -R user:group directory #修改目录directory及目录下的所有文件的所属用户是user,所属组为group chown user file #修改file 所属用户为user chgrp #更改文件所属组,类似chown chgrp -R group directory #修改directory 及目录下面所有文件所属组
命令与文件查询:
which : 返回PATH 路径下的可执行文件 which pwd/ls : 返回alias / build-in cmd / bin
whereis : 寻找命令, 包含二进制/源文件/ 手册 -b: 只查找二进制文件 -m: 只查找manual 路径下文件 -s: 只查找source 源文件 -u: 查找其他文件
locate : 搜索文件(可部分查找)速度很快,因为这个是考维护/var/lib/mlocate/索引库,实现查找的; 可以通过 sudo updatedb 方式更新这个文件 -i : 忽略大小写 -r : 按正则查找
find : 多样化高级查找,多用来查找特定要求 与时间相关的参数 -atime, -ctime, -mtime ---------2---------1---------now------ mtime +2| mtime 1| mtime -1 -mtime n : n天之前的(一天内)修改过的文件 -mtime +n : n天之前,不包含n,修改过的文件 -mtime -n: n天之内,包含n, 修改过的文件 -newer file: 比file 还要新的文件 与用户或用户组相关参数 -uid n: 用户UID 为n (id 可以查看uid 相关值) -gid n: 群组GID 为n -user name : 用户名为name -group name : 群组名name nouser : 文件所有者不存在 nogroup: 文件所在组不存在 //针对一些账户被删除以后的寻找相关操作 与文件权限及名字相关参数 -name filename : 文件名filename -size[+-] SIZE :查找比SIZE 大或小的 //find . -size -1M -type TYPE: f b c d l s p //不同文件类型 //find / -type p -perm mode : 刚好包含mode文件 find . -perm -o=rwt -perm -mode: permission, 全部包含mode文件, 找到文件后,还可以进行后续的操作; -exec 指执行后面的命令,{}中存放的是find 找到的值,直到遇到;就执行命令所有参数结束; -delete : 删除找到的文件,可以直接用 -delete; 也可以使用 -exec rm -f {} \; EXAM: find . size 0 -exec ls -al {} \;
搭配文件篇中的描述符,可以实现只保留成功信息; find / -perm -o=rwt 2>/dev/null 1>11.txt //其中 /dev/null 是文件回收站 2>/dev/null 其中必须没有空格 通过将错误的信息2放入回收站,有用信息放入文件,减少大量无用信息刷屏;
查找某个文件夹下特定后缀文件, 并统计行数, 字数 find /home/guigym/personal/ -name "*.c" -o -name "*.cpp" -exec cat {} \; #打印出找到的文件内容,其中-o 是逻辑or 意思(-a 是逻辑 and); cat `find /home/guigym/personal/ -name "*.c" -o -name "*.cpp"` | wc -w(-l, -m) // 统计找到文件中字数/行数;
用户管理:
su : 切换用户 -| -l : login 重新登陆 -m | -p: preserver-environment 不更改环境变量 -c command : command 切换后执行命令,并退出; su - guigym -c pwd sudo: 临时切换为root 用户 ; -i: 切换到root 用户,并使用root 下 shell 设定 -s: 切换到root 用户,使用当前shell 设定 passwd : 设定用户密码, /etc/shadow 里面的信息都可以通过passwd更改 -d:delete 清除密码 -l: lock 锁定用户 -e: expire 使密码过期 -S: status 显示密码认证日期 -x days : max days 密码过期后最大使用天数 -n days : 密码冻结后最小使用时间 gpasswd: 设定组密码 -a username : 将用户加入群组 -d username : 将用户从群组中删除 -r : 删除密码 -A usename :将用户设置为群组管理员 -M username1, username2, ... : 设置群组成员; chsh 修改用户shell chsh -s shell_path usermod : 修改用户账号 -c string : 更改备注信息 -d dir : 修改$HOME -e day: 账号期限 -f days:密码过期后宽限日期 -g groupname : 修改该用户所属群组 -l username :修改该用户账号名称 -L : 锁定用户密码,使密码无效 -s shell:修改用户登陆所使用shell -u uid : 修改用户ID useradd : 新建用户 -d dir: 制定$HOME -m: 自动建$HOME -M: 不自动建立$HOME -s: 指定shell -c: 设置用户备注 userdel : 删除用户 -r: 删除用户相关文件与目录 id : 显示用户信息 -g:下属所属组id -G: 附加组id
进程管理
free: free and used memory state, 打印系统情况与内存情况 free -b/k/m/g : 以字节为单位显示 free -s 5 : 每隔5s 显示一次 free -h : human, 以人类可读方式,加上各自对应单位 free -c 10:一共打印次数 top: 显示当前系统进程情况,内存,cpu 等信息 dstat:disk state 系统资源信息统计工具 dstat 2 3 : 2s 刷新一次,一共更新3次 dstat -list ps: process state 报告当前进程状态 ps -aux ps -fe pstree: process state tree, 树状显示进程派生关系 pstree -p : 显示pid pstree -u : 显示用户 pgrep: process grep, 查找进程 kill: 删除执行中的进程和工作,通过ID 来杀进程 pkill: 批量按照进程名删除进程,通过名字来杀进程(一般是模糊匹配)
数据提取操作:
nl : number line for file or standard input;对输入实现行数计量;一般对于cat 文件来讲有 -n 选项,但是对于一些管道/输入信息,这个就比较有效果;
cut : 切分 (如果没有输入,则以输入内容为输入) cut -d c :delimiter 以c 字符分割 : cut -f num: field, 显示num 字段的内容 [n-; n-m; -m; m,n] cut -b num: bytes 结果取第几个字节 cut -c num: character, 只取这个范围内字符
grep: 检索 grep -w : word-regexp 作为完整单词搜索 grep -c : count 统计匹配到次数 grep -i : ignore-case 忽略大小写 grep -n : line-number 可以打印行数 grep -v : invert-match 反向输出(不包含搜索的内容)
sort :排序 -f : ignore case 忽略大小写 -M : month-sort 以月份名称排序 -n: numeric-sort 根据数值排序 -r: reverse 反向排序 -u: uniq last | cut -d " " -f 1 | grep -v "^$" | grep -v "wtmp" | sort -u -c: check 检查文件是否有序 -t 分隔字符: 指定排序是使用的栏位分隔字符 -k :key 以区间排序 + : 排序栏位,第一栏为0, 按顺序优先排序;
下面例子里面主要是sort 的用法,还有-n 是按照数值大小排列, -k 是以区间字符串顺序排列;
主要演示了-u 的效果,以及把前面一些命令综合起来应用;
wc: 统计字符, 字数,行数 -l: line 仅列出行号 -w: words 仅列出多少word,以空格和换行为一个单词间隔 -m: 仅列出多少字节 byte -c: 列出多少字符 character -L:max-line-length, 列出最长一行的字符长度 //wc -m 与 -c, 对于英文没看出差别,中文是不一样; // 统计文件夹下cpp 文件中字符个数
uniq : 去重 , 必须要先sort,因为这个只和相邻行判断,没sort 就没办法 uniq -i : 忽略大小写 -c: 计数 -u:只输出无重复行
tee : 双向重定向 -a : append 追加 EAXM:ping www.baidu.com | tee output : 即会输出在终端也会在文件中保存一份,这样后面回看时候,要是终端已经被清空了,可以看文件中内容
split: 文件切分 -b size : bytes 切分为size bytes 大小文件 -C size : line-bytes 切分为size bytes 大小文件,但是不会断开一行 -l num : lines 以num行为大小切分 split -C 1k filename //切分后的文件的前缀名,对于非文件类型不可以提供前缀名;没有前缀名就用默认名
xargs : 参数替换, 针对一些需要前一个返回的结果值,来作为下一个命令的参数来使用 -p : prompt, interactive执行指令前询问 ls filename | xargs -p cat -n num :每次执行cmd时需要的参数个数,防止返回了一堆数据,然后一次性都传给了后面的命令,这个可以指定每次给多少数据 cat /etc/passwd | cut -d : -f1 | xargs -n 1 id -e 到等于某个参数时候,就结束 cat /etc/passwd | cut -d : -f1 | xargs -n 1 -p -esys id
tr:(translate or delete characters) 替换 压缩和删除 tr [option] .. SET1 [SET2] -c : 取代所有不属于第一字符集的字符 complement -d : delete 删除所有属于第一字符集的字符 -s : squeese-repeats 将SET1中连续重复的字符以单独的一个字符表示 -t : truncate-set1 将第一字符集替换成第二字符集,如果SET1 与 SET2 字符集不匹配,不匹配部分不会替换。 a='asfsa52sf234322652444' && echo ${a} | tr "[:lower:]" "[:upper:]"
其他:
tldr(too long don't read) : 精简列出各个命令选项,包含大部分的命令(不包含C库),需要专门安装;
远程文件转移:
scp 文件名 用户名@主机名:目标位置 #从本地拷贝到远程主机 scp 用户名@主机名:文件名 目的位置 #从远程位置拷贝文件到本地 wget 47.93.11.51:88/install_zsh.sh #从地址中获取文件到当前目录
grep/sed/awk linux 命令中三剑客:
grep:
正则表达式 regular expression, 对文本进行过滤的工具,有各种元字符 和 一般字符 构成的字符串;
字符定义: 可以(man tr) 查看相关字符定义
匹配普通字符 . 忽略大小写 -i ; 转义元字符 \$ \\ grep '\b' 一系列字符集合 "[abcd]" 或者 \[0-9a-d\] 排除字符集合 [^0-9] 定位符 : ^ 行首; $ 行尾 ; \b 单词边界 ;\B 单词非边界 // echo "hello llob loca" | grep "\Blo"
POSIX 字符集:
[:alnum:] : 所有字母和数字 [0-9a-zA-Z] [:digit:] : 数字 [:alpha:] : 字母 [:upper:] : 大写字母 [:lower:] : 小写字母 [:blank:] : 空格 [:graph:] : 非空字符 [:punct:] : 标点符号
扩展正则: 一个或多个 + 0次或多次 * 0个或一个 ? 指定个数 {2,4}; // echo "hello " | grep "[[:digit::]]\{2\}" //注意是否需要转义符 // echo "hello " | grep -E "[[:digit::]]{2}" -E 以后可以不用转义 -P perl 正则表达 (man grep / man tr) 查看相关定义 grep -p '\d' : 包含数字 ; \D 不包含数字; \w 包含单词字符; \W 不包含单词字符
-E extended-regexp grep -E "\w+\@[:alnum:]+\.[com]"
homework: echo "dolai_c@163.com" | grep -E "[a-zA-Z0-9][a-zA-Z0-9_]*\@[[:alnum:]]+\.com"
sed:
sed 非交互式文本编辑器 : 每次从文件和标准输入中每次读取一行数据复制到缓冲区中,然后读取命令行或脚本的编辑子命令,对缓冲区文本进行编辑.
sed [OPTION]... {script-only-if-no-other-script} [input-file]...
OPTION:
-n : 安静模式
-e : 不编辑源文件,默认选项
-f : 使用脚本文件中操作, 这里脚本中使用sed 中操作命令;a/c/s/d/p ... 这些;
-r : 支持正则
-i : 直接修改文件
Script:
a :追加 //cat a.txt | sed '1a new add one line after 1;' 在后面追加
c :替换行 //cat a.txt | sed '1,+2cxxxxx' ; 这里替换是将这一系列行,换成某个字符串;
d : 删除 //cat a.txt | sed '4,6d'
i : 插入 // cat a.txt | sed 'i1 xxx' ; 在指定行插入
p : 打印
~: 表示步长 //cat a.txt | sed -n '1~2p'
+: 连续几行 //cat a.txt | sed -n '1+3p'
s : 字符匹配以后进行替换字符 // cat a.txt | sed 's/l/xxx/g' //没有g 的话,只会替换第一个
awk: 是一种强大的数据处理工具,也是一种编程语言环境;
是以空格作为分隔符;
格式: awk [-Ffv] 'BEGIN{commands} pattern {commands} END{commands}' file
-F fs: 指定输入风格符号, fs 可以是字符串或正则 -F -v var=value 赋值一个用户定义变量,将外部变量传递给awk -f scriptfile 从脚本文件中读取awk 命令 第一步: 执行BEGIN{commands} 语句中的语句 第二步: 从文件或stdin 中读取一行,执行pattern {commands} 逐行扫描文件,从第一行到最后一行重复这一过程,直到读完 第三步: 当读至输入流末尾时候,执行END{commands} 语句中内容 last | grep -v "^$" | grep -v "wtmp" | cut -d " " -f1| sort | uniq -c | awk 'BEGIN{printf("start\n")} {sum =sum+$1} END{printf("vip sum=%d\nend\n", sum)}' last | grep -v "^$" | grep -v "wtmp" | cut -d " " -f1| sort | uniq -c | awk -v sum=0 '{if($1 >=5){sum+=$1} printf("%d %s\n", $1, $2)} END{printf("sum=%d\nend\n",sum)}' eval `last | grep -v "^$" | grep -v "wtmp" | cut -d " " -f1| sort | uniq -c | awk -v sum=0 '{if($1 >=5){sum+=$1}} END{printf("sum=%d\n",sum)}'` 后面可以 echo ${sum} 打印出变量值, eval 可以将输出信息,作为当前命令行输入处理,实现赋值 homework : 1. 显示root用户的默认shell answer: cat /etc/passwd | grep root | cut -d : -f7 2. 找出 /etc/passwd 中两位或者三位数 cat /etc/passwd | tr : '\n' | sed -r 's/[^0-9]//g' | grep '\b[0-9]\{2,3\}\b' 3. 计算/etc/passwd 中UID 为两位数或三位数的和 my answer: cat /etc/passwd | cut -d : -f3 | grep '\b[0-9]\{2,3\}\b'| awk -v sum=0 '{sum=sum+$1} END{printf("%d\n",sum);}' answer: cat /etc/passwd | grep -w -E "[[:digit:]]{2,3}" | awk -F : -v sum=0 '{if($3 > 9 && $3 <1000) {sum=sum+$3}} END{printf("%d\n", sum)}' 4. 计算3*3 数组 1|2|3\n4|5|6\n7|8|9 中间列的和 my answer: cat a.txt| cut -d "|" -f2 | awk -v sum=0 '{sum=sum+$1} END{printf("%d\n",sum)}' answer : echo "1|2|3\n4|5|6\n7|8|9" | awk -F "|" -v sum=0 '{sum=sum+$2} END{printf("%d\n",sum)}' 5. 顺序打印/etc/passwd 名字及顺序编号。 格式: 编号 名字。 my answer: cat /etc/passwd |cut -d : -f1|nl answer: line=`cat /etc/passwd | wc -l` cat /etc/passwd | awk -F : -v num=1 -v I=line'{if(num<I){printf("%2d %s\n",num++,$1)}}
nethogs -- 检测系统占用带宽情况
htop--交互式的进程浏览器
nmon --先是所有重要的性能优化信息
dstat--全能信息统计工具