linux021 管道命令

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

你可能感兴趣的:(linux021 管道命令)