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 |