Bash在执行命令的时候,有输出的数据会出现,如果数据需要经过多次处理后才能得到我们所需要的各式,这就需要牵涉到管道(pipe)命令的问题
如我们想要知道/etc下有多少个文件夹:
# 直接使用ls命令,因etc文件夹中内容较多,无法得知前面的输出内容
ls -al /etc
# 通过管道将ls的输出传递至less读取
ls -al /etc | less
1 选取命令 grep,cut
1.1 grep
详见:linux020 文本处理命令 grep,sed,awk
1.2 cut
cut OPTION... [FILE]...
cut 命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段写至标准输出,如果不指定 File 参数,cut 命令将读取标准输入,必须指定 -b、-c 或 -f 标志之一。
参数 | 含义 |
---|---|
-c | 以字符为单位进行分割 |
-d | 自定义分隔符,默认为制表符 |
-f | 与-d一起使用,表示取出第几个字段的意思 |
# 提取 /etc/passwd前三行,经管道传递至cut,-d指定分隔符':',-f指定取出第2个字段,
head -3 /etc/passwd | cut -d ':' -f 2
# 提取 /etc/passwd前三行,经管道传递至cut,取出每行第1个字符,-c适合用于排列整齐的信息
head -3 /etc/passwd | cut -c 1
2.排序命令 sort,wc,uniq
2.1 sort
sort [-bcdfimMnr][-o<输出文件>][-t<分隔字符>][+<起始栏位>-<结束栏位>][--help][--verison][文件]
参数 | 含义 |
---|---|
-b | 忽略每行前面开始出的空格字符 |
-c | 检查文件是否已经按照顺序排序 |
-d | 排序时,处理英文字母、数字及空格字符外,忽略其他的字符 |
-f | 排序时,将小写字母视为大写字母,也即是忽略大小写 |
-i | 排序时,除了040至176之间的ASCII字符外,忽略其他的字符 |
-m | 将几个排序好的文件进行合并 |
-M | 将前面3个字母依照月份的缩写进行排序 |
-n | 依照数值的大小排序 |
-u | 意味着是唯一的(unique),输出的结果是去完重了的 |
-o<输出文件> | 将排序后的结果存入指定的文件 |
-r | 以相反的顺序来排序 |
-t<分隔字符> | 指定排序时所用的栏位分隔字符 |
-k | 指定区间进行排序 |
+<起始栏位>-<结束栏位> | 以指定的栏位来排序,范围由起始栏位到结束栏位的前一栏位 |
--help | 显示帮助 |
--version | 显示版本信息 |
# 直接对passwd进行排序
cat /etc/passwd | sort
# 将/etc/passwd文件按以冒号为分隔的第三列进行排序
cat /etc/passwd | sort -t ':' -k 3
2.2 uniq
uniq [-cdu][-f<栏位>][-s<字符位置>][-w<字符位置>][--help][--version][输入文件][输出文件]
linux下可以用uniq命令可以去除重复行,使用uniq的时候要注意以下二点
- 对文本操作时,一般会和sort命令进行组合使用,因为uniq不会检查重复的行,除非它们是相邻的行。如果您想先对输入排序,使用sort -u。
- 对文本操作时,若域中为先空字符(通常包括空格以及制表符),然后非空字符,域中字符前的空字符将被跳过
参数 | 含义 |
---|---|
-c, --coun | 在每行前加上表示相应行目出现次数的前缀编号 |
-d, --repeate | 只输出重复的行 |
-D, --all-repeate | 只输出重复的行,不过有几行输出几行 |
-f, --skip-fields=N | -f 忽略的段数,-f 1 忽略第一段 |
-i, --ignore-case | 不区分大小写 |
-s, --skip-chars= | 与-f有点像,不过-s是忽略后面多少个字符,-s 5就忽略后面5个字符 |
-u, --unique | 去除重复的后,全部显示出来,根mysql的distinct功能上有点像 |
-z, --zero-terminated | end lines with 0 byte, not newline |
-w, --check-chars=N | 对每行第N 个字符以后的内容不作对照 |
--help | 显示此帮助信息并退出 |
--version | 显示版本信息并退出 |
# 截取passwd以冒号分隔的第三列,sort -n按数值大小排序,uniq -c统计唯一数字的数目
cut -d ':' -f 3 etc/passwd | sort -n | uniq -c
2.3 wc(word count)
统计指定文件中的字节数、字数、行数,并将统计结果显示输出。该命令统计指定文件中的字节数、字数、行数。如果没有给出文件名,则从标准输入读取。wc同时也给出所指定文件的总统计数。
wc [OPTION]... [FILE]...
参数 | 含义 |
---|---|
-c | 统计字节数 |
-l | 统计行数 |
-m | 统计字符数。这个标志不能与 -c 标志一起使用 |
-w | 统计字数。一个字被定义为由空白、跳格或换行字符分隔的字符串 |
-L | 打印最长行的长度 |
-help | 显示帮助信息 |
--version | 显示版本信息 |
3 字符转换命令
3.1 tr
tr [OPTION]... SET1 [SET2]
从标准输入中替换、缩减和/或删除字符,并将结果写到标准输出。
参数 | 含义 |
---|---|
-c, -C, --complement | 首先补足SET1 |
-d, --delete | 删除匹配SET1 的内容,并不作替换 |
-s, --squeeze-repeats | 如果匹配于SET1 的字符在输入序列中存在连续的重复,在替换时会被统一缩为一个字符的长度 |
-t, --truncate-set1 | 先将SET1 的长度截为和SET2 相等 |
--help | 显示此帮助信息并退出 |
--version | 显示版本信息并退出 |
SET 是一组字符串,一般都可按照字面含义理解。解析序列如下:
SET | 含义 |
---|---|
\NNN | 八进制值为NNN 的字符(1 至3 个数位) |
\ | 反斜杠 |
\a | 终端鸣响 |
\b | 退格 |
\f | 换页 |
\n | 换行 |
\r | 回车 |
\t | 水平制表符 |
\v | 垂直制表符 |
字符1-字符2 | 从字符1 到字符2 的升序递增过程中经历的所有字符 |
[字符*] | 在SET2 中适用,指定字符会被连续复制直到吻合设置1 的长度 |
[字符*次数] | 对字符执行指定次数的复制,若次数以 0 开头则被视为八进制数 |
[:alnum:] | 所有的字母和数字 |
[:alpha:] | 所有的字母 |
[:blank:] | 所有呈水平排列的空白字符 |
[:cntrl:] | 所有的控制字符 |
[:digit:] | 所有的数字 |
[:graph:] | 所有的可打印字符,不包括空格 |
[:lower:] | 所有的小写字母 |
[:print:] | 所有的可打印字符,包括空格 |
[:punct:] | 所有的标点字符 |
[:space:] | 所有呈水平或垂直排列的空白字符 |
[:upper:] | 所有的大写字母 |
[:xdigit:] | 所有的十六进制数 |
[=字符=] | 所有和指定字符相等的字符 |
3.2 col
col [-bfhpx] [-l nline]
选项 | 描述 |
---|---|
-b | 过滤掉所有的控制字符,包括RLF和HRLF |
-f | 滤除RLF字符,但允许将HRLF字符呈现出来 |
-x | 以多个空格字符来表示跳格字符 |
-l<缓冲区列数> | 预设的内存缓冲区有128列,您可以自行指定缓冲区的大小 |
# 将man 命令的帮助文档保存为man_help,使用-b 参数过滤所有控制字符。
man man | col-b > man_help
3.3 join
join [OPTION]... FILE1 FILE2
功能:“将两个文件里指定栏位同样的行连接起来”,即依照两个文件里共有的某一列,将相应的行拼接成一行。这两个文件必须在已经在此列上是依照同样的规则进行了排序。
选项 | 描述 |
---|---|
-a FILENUM | 除了显示匹配好的行另外将指定序号(1或2)文件里部匹配的行显示出来 |
-e EMPTY | 将须要显示可是文件里不存在的域用此选项指定的字符取代 |
-i | 忽略大写和小写 |
-j FIELD | 等同于 -1 FIELD -2 FIELD,-j指定一个域作为匹配字段 |
-o FORMAT | 以指定格式输出 |
-t CHAR | 以指定字符作为输入输出的分隔符, join默认以空白字符做分隔符(空格和\t),能够使用 join -t $'\t'来指定使用tab做分隔符 |
-v FILENUM | 与-a相似 但值显示文件里没匹配上的行 |
-1 FIELD | 以file1中FIELD字段进行匹配 |
-2 FIELD | 以file2中FIELD字段进行匹配 |
--help | 打印命令帮助文件 |
3.4 paste
paste [OPTION]... [FILE]...
paste单词意思是粘贴。该命令主要用来将多个文件的内容合并,与cut命令完成的功能刚好相反。粘贴两个不同来源的数据时,首先需将其分类,并确保两个文件行数相同。paste将按行将不同文件行信息放在一行。缺省情况下, paste连接时,用空格或tab键分隔新行中不同文本,除非指定-d选项,它将成为域分隔符。
选项 | 描述 |
---|---|
-d | 指定不同于空格或tab键的域分隔符。例如用@分隔域,使用- d @ |
-s | 将每个文件合并成行而不是按行粘贴 |
3.5 expand
expand命令 用于将文件的制表符(TAB)转换为空白字符(space),将结果显示到标准输出设备。
expand [OPTION]... [FILE]...
选项 | 描述 |
---|---|
-t | 指定制表符所代表的空白字符的个数,而不使用默认的8 |
-i | 不转换非空白符后的制表符 |
--help | 显示帮助信息 |
--version | 显示版本信息 |
4 切割命令split
Linux split命令用于将一个文件分割成数个,该指令将大文件分割成较小的文件,在默认情况下将按照每1000行切割成一个小文件。
split [OPTION]... [FILE [PREFIX]]
选项 | 描述 |
---|---|
-b | 指定每多少字节切成一个小文件 |
--help | 查看帮助信息 |
--version | 显示版本信息 |
-C | 与参数”-b”相似,但是在切 割时将尽量维持每行的完整性 |
5 参数转换 xargs
xargs命令是给其他命令传递参数的一个过滤器,也是组合多个命令的一个工具。它能够将标准输入或管道中的数据转换为特定命令的命令行参数,也可以将单行或多行文本输入转换为其他格式的数据,比如单行变多行或者多行变单行。xargs的默认命令是echo,默认分隔符是空格。通过xargs的处理,换行和空白都会被替换为空格。
somecommand | xargs [OPTION]... COMMAND [INITIAL-ARGS]...
选项 | 描述 |
---|---|
-a file | 从文件中读入作为sdtin |
-e flag | 注意有的时候可能会是-E,flag必须是一个以空格分隔的标志,当xargs分析到含有flag这个标志的时候就停止 |
-p | 当每次执行一个argument的时候询问一次用户 |
-n num | 后面加次数,表示命令在执行的时候一次用的argument的个数,默认是用所有的 |
-t | 表示先打印命令,然后再执行 |
-i 或者是-I | 这得看linux支持了,将xargs的每项名称,一般是一行一行赋值给 {},可以用 {} 代替 |
-r no-run-if-empty | 当xargs的输入为空的时候则停止xargs,不用再去执行了 |
-s num | 命令行的最大字符数,指的是 xargs 后面那个命令的最大命令行字符数。 |
-L num | 从标准输入一次读取 num 行送给 command 命令 |
-l | 同 -L |
-d delim | 分隔符,默认的xargs分隔符是回车,argument的分隔符是空格,这里修改的是xargs的分隔符 |
-x | exit的意思,主要是配合-s使用 |
-P | 修改最大的进程数,默认是1,为0时候为as many as it can |