管道命令
- bash 命令执行的时候,有输出的数据会出现,如果这些数据需要经过几道处理后才能得到我们所想要的格式,那么这个时候管道命令就很有用。
- 管道命令仅能处理由前面一个命令传来的正确信息,也就是标准输出信息,对于标准错误输出没有直接处理能力。
- 在每一个管道后边跟的必定是【命令】,且该命令必须要能够接受标准输入的命令才可以,这样的命令才是管道命令。
选取命令:cut、grep
- 选取命令就是将一段数据经过分析后,取出我们所需要的。
cut:
- 处理的信息以行为单位
- 指令格式:【cut -d’分隔字符‘ -f fields】,【cut -c 字符区间】
参数 | 说明 |
---|---|
-d | 其后跟分隔符,与 -f 一起使用 |
-f | 根据 -d 分隔字符将一段信息划分为多段,用 -f 取出第几段 |
-c | 以字符为单位取出固定字符区间 |
grep:
- 分析一行信息,若有我们所需要的信息,就将该行拿出来
- 指令格式:grep [参数] [–color=auto] '查找字符’ filename
参数 | 说明 |
---|---|
-a | 将二进制文件以文本文件的方式查找数据 |
-c | 计算找到 ’ 查找字符‘ 的次数 |
-i | 忽略大小写 |
-n | 输出带行号 |
-v | 反向选择,即显示没有 ’ 查找字符‘ 那一项 |
–color=auto | 将找到的关键字部分加上颜色 |
排序命令:sort、wc、uniq
sort
- 格式:sort [参数] [filr or stdin]
参数 | 说明 |
---|---|
-f | 忽略大小写 |
-b | 忽略最前面的空格部分 |
-M | 以月份名字来排序 |
-n | 使用纯数字进行排序(默认是以文字形式进行排序) |
-r | 反向排序 |
-u | 即 uniq(唯一),相同数据仅出现一行代表 |
-t | 分隔字符(默认使用 [ tab ] 进行分隔 |
-k | 以哪个区间进行排序的意思 |
范例 1:/etc/passwd 内容是以 :来进行分隔的,想以冒号分隔的第三栏来进行排序,所使用命令为【 cat /etc/passwd | sort -t ':’ -k 3 】
uniq
- 该命令将重复数据仅列出一行显示
- 格式:uniq [ -ic ]
- -i :忽略大小写
- -c:进行计数
wc
- 该命令可以计算输出信息的整体数据
- 格式:wc [ -lwm ]
- -l:仅列出行数
- -w:仅列出字数(英文字母)
- -m:列出字符数
双重定向:tee
- tee 会同时将数据流分送到文件与屏幕
- 格式:tee [ -a ] file
- -a:以累加的方式,将数据加入 file 中
- 注意:tee 后边跟的file(文件)若原本有内容,则会覆盖掉
范例 2:【 ls -l /home | tee ~/homefile | more 】,该命令是将 ls 的数据存一份到 ~/homefile,同时也在屏幕输出。
字符转换命令
tr:删除一段信息中的文字或是进行文字的替换
- 格式:tr [-ds] SET1
- -d:删除信息当中的 SET1 这个字符
- -s:替换掉重复的字符
- 例如:将 last 输出的信息中,所有的小写字符变为大写,所用命令为【last | tr ‘[a-z]’ ‘[A-Z]’】,此处不加单引号也可以执行。
col
- 可以简单的将 [tab] 键替换为空格
- 格式:col [-xb]
- -x:将 tab 键换成对等的空格
范例 3:利用 cat -A 显示出所有的特殊按键,再用 col 将所有的 tab 转为空格。所用命令为【cat -A /etc/man_db.conf | col -x | col -A | more】
join:用于处理两个文件中有相同数据的一行,就将它们加在一起
- join [参数] file1 file2
参数 | 说明 |
---|---|
-t | join 默认以空格字符分隔数据,并且比对【第一个栏位】的数据。如果两个文件相同,则将两条数据连成一行,且将第一个栏位放在第一个 |
-i | 忽略大小写 |
-1 | 数字 1,代表第一个文件要以第几个栏位来分析 |
-2 | 数字 2,代表第二个文件要以第几个栏位来分析 |
- 注意:在使用 join 之前,所要处理的文件应该先进行排序处理,否则有些对比的项目会被忽略。
paste:即粘贴,直接将两行贴在一起,中间以 [tab] 键分隔
- 格式:paste [-d] file1 file2
- -d:后边跟分隔符,默认是以 tab 分隔
- -:如果 file 部分写成 - ,表示来自标准输入的数据的意思
expand:将 [tab] 转成空格
- 格式:expand [-t] file
- -t:后边跟数字,一般一个 tab 用 8 个空格替换,用该参数可以自行定义一个 tab 代表几个空格
划分命令:split
- 将一个大文件,依据文件或行数来将其划分为几个小文件
- 格式:split [-bl] file PREFIX
参数 | 说明 |
---|---|
-b | 其后跟欲划分成的文件大小,可跟单位如:b、k、m |
-l | 以行数来进行划分 |
PREFIX | 代表前缀字符,可作为划分文件的前缀文字 |
范例 4:/etc/services 有六百多K,将其分成300K一个文件,所用命令为【cd /tmp; split -b 300k /etc/services sevices】,执行完毕后使用 ll 查看会发现有三个文件分别为:servicesaa、servicesab、servicesac。只要我们给定前缀文字,小文件就会以 xxxaa、xxxab、xxxac 等命名方式来建立小文件。
- 使用数据流重定向即可将范例 4 中的三个小文件合并成一个大文件,所用命令为【cat services* >> servicesback】
参数代换:xargs
- xargs 其实就是在产生某个命令的参数的意思,xargs 可以读入 stdin 的数据,并以空格符或换行符作为识别符,将 stdin 数据分隔成为参数。
- 格式:xargs [参数] command
- 当 xargs 后边没跟任何命令时,默认是以 echo 来输出。
- 使用 xargs 时因为,很多命令其实并不支持管道命令,因此可以通过 xargs 来提供该命令使用标准输入。
参数 | 说明 |
---|---|
-0 | 如果输入的 stdin 含有特殊字符,该参数可将特殊字符变为一般字符 |
-e | end of file 的意思,后边可以跟一个字符,当分析到这个字符时,就会停止工作 |
-p | 执行每个命令都会询问使用者 |
-n | 其后跟次数,每次命令执行时,要使用几个参数的意思 |
范例 5:将 /etc/passwd 的第一栏取出,仅取三行,使用 id 这个命令将每个账号内容显示出来。所用命令为【cut -d ‘:’ -f 1 /etc/passwd | head -n 3 | xargs -n 1 id】,由于 id 命令一次只能接受一个参数,所以 xargs 利用 -n 1 每次只向 id 传递一个参数。
减号的用途
- 在管道命令中,常常会使用到前一个命令的 stdout 作为这次的 stdin,某些命令(如 tar)需要用到文件名来处理时,该 stdin 与 stdout 可以利用 ‘ - ’ (减号)来替代。用以下范例 6 进行说明:
范例 6:【tar -cvf - /home | tar -xvf - -C /tmp/homeback】,这条命令是将 /home 里边的文件打包,但打包的数据不是记录到文件,而是传送到 stdout ,经过管道后,将【tar -cvf -/home】传送给后面的 【tar -xvf -】,后面这个 - 使用的是前一个命令的 stdout,因此不需要文件名。