5-管线‘|‘常用指令(筛选、排序、tab转空格、重定向、切分文件等)

文章目录

  • 常用管线命令
    • cut 截取
    • grep 过滤
    • sort 排序
    • uniq 去重、计数
    • wc 统计
    • tee 双向重定向
    • tr 删除或替换某字符串
    • 将tab转为空格
      • col
      • expand
    • join 合并两个文件的数据
    • paste
    • split 将大文件分割
    • xargs 参数代换
  • 番外
    • 关于减号(-)的使用

说明:
管线仅能处理经由前面一 个指令传来的正确信息,错误信息不能直接处理,要想处理错误信息,需要吧错误输出重定向成为标准输出
管线命令必须能够接受来自前一个指令的数据成为输入,然后继续进行处理才可以

常用管线命令

指令选项不一定全,详细信息可以使用 --help 查看

cut 截取

切割获取行信息
使用说明:

# 用于有特定分隔字符,分割后下标从1开始
cut -d'分隔字符' -f fields

# 用于排列整齐的讯息
cut -c 字符区间

选项与参数:

-d :后面接分隔字符。与 -f 一起使用;
-f :依据 -d 的分隔字符将一段讯息分区成为数段,用 -f 取出第几段的意思;
-c :以字符 (characters) 的单位取出固定字符区间;

样例:

# 查看PATH
echo $PATH
# 结果
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

# 使用cut查看环境变量的第2个
echo $PATH | cut -d ":" -f 2
# 输出,cut下标从1开始,需要注意
/usr/local/bin

# 使用cut查看环境变量的第2-4个,左闭右开
echo $PATH | cut -d ":" -f 2-4
# 输出,cut下标从1开始,需要注意
/usr/local/bin:/usr/sbin:/usr/bin

# 查看第2-3的字符,下标从1开始,左闭右闭
echo $PATH | cut -c 2-3
# 输出
us

# 查看20到结尾的字符
echo $PATH | cut -c 20-
# 输出
r/local/bin:/usr/sbin:/usr/bin:/root/bin

grep 过滤

语法:

grep [-acinv] [--color=auto] '搜寻字串' filename

选项与参数:
-a :将 binary 文件以 text 文件的方式搜寻数据
-c :计算找到 '搜寻字串' 的次数
-i :忽略大小写的不同,所以大小写视为相同
-n :顺便输出行号
-v :反向选择,亦即显示出没有 '搜寻字串' 内容的那一行!
--color=auto :可以将找到的关键字部分加上颜色的显示喔!

sort 排序

排序的字符与语系的编码有关,如果需要排序,建议先使用LANG=C 先统一语系,然后再进行排序

语法:

sort [-fbMnrtuk] [file or stdin]

选项与参数:
-f :忽略大小写的差异,例如 A 与 a 视为编码相同;
-b :忽略最前面的空白字符部分;
-d :只考虑空格和字母数字字符
-i :仅考虑可打印字符
-M :以月份的名字来排序,例如 JAN, DEC 等等的排序方法; 
-g :根据一般数值进行比较
-n :根据字符串数值进行比较
-h :比较人类可读的数字(例如2K 1G)
-r :反向排序;
-u :就是 uniq ,相同的数据中,仅出现一行代表;
-t :分隔符号,默认是用 [tab] 键来分隔;
-k :以那个区间 (field) 来进行排序

uniq 去重、计数

去除重复的数据,但是只能去除和上一个一样的数据。

uniq [-ic]

选项与参数:
  -i :忽略大小写字符的不同; 
  -c :进行计数

注意:只能去除连续的重复,如果不连续,将不会被去重
例如:文件t内容如下

111
222
111
222

直接使用uniq 去除重复:

cat t | uniq

# 输出:
111
222
111
222

没有生效,如果先排序,在进行才能顺利的去除重复部分:

# 排序
cat t | sort
# 排序后的结果:
111
111
222
222

# 排序后去重,并且计数
cat t | sort | uniq -c
# 输出: 出现次数 内容
2 111
2 222

如果需要记录重复出现的个数,可以用sort结合uniq -c 一起使用,单纯去除重复,使用sort -u 就可以实现了

wc 统计

获取一些统计信息,例如:行数、单词数、字符数等
用法:

# 不加参数的时候,默认显示行数 单词数 字符数
wc [-lwmLc]

选项与参数:
-l :仅列出行;
-w :仅列出多少个单词(英文单字); 
-m :多少字符;
-L :最长的行的长度
-c :所占字节数

tee 双向重定向

tee 会同时将数据流分送到文件去与屏幕 (screen);
而输出到屏幕的, 其实就是 stdout ,那就可以让下个指令继续处理

# 语法:
tee [-a] file

选项与参数:
-a :以累加 (append) 的方式,将数据加入 file 当中!若不使用 -a 则文件如果已存在,会被覆盖

tr 删除或替换某字符串

tr 可以用来删除一段讯息当中的文字,或者是进行文字讯息的替换

# 语法:
tr [-ds] SET1 ...

选项与参数:
-d :删除讯息当中的 SET1 这个字串; 
-s :取代掉重复的字符!

例子:

# 文件t内容
cat t
# 输出
111
222

# 将1替换为3
cat t | tr 1 3
# 输出
333
222

# 删除1
cat t | tr -d 1
# 输出

222

将tab转为空格

col

用法:

col [-xb]

选项与参数:
-x :将 tab 键转换成对等的空白键

样例用法:

# 将test.py 中的tab转换成空格,然后输出到 new_test.py文件中
cat test.py | col -x > new_test.py

expand

将文件的 tab 键转换为空格

expand [-t] file

选项与参数:
-t :后面可以接数字。一般来说,一个 tab 按键可以用 8 个空白键取代。
    我们也可以自行定义一个 [tab] 按键代表多少个字符呢!

join 合并两个文件的数据

用法:

join [-ti12] file1 file2

选项与参数:
-a :完全展示某文件的内容,例如:-a 1,完全展示1的内容
-t :指定分隔符。join 默认以空白字符分隔数据,并且比对“第一个字段”的数据,
如果两个文件相同,则将两笔数据联成一行,且第一个字段放在第一个!
-i :忽略大小写的差异;
-1 :这个是数字的 1 ,代表“第一个文件要用那个字段来分析”的意思;
-2 :代表“第二个文件要用那个字段来分析”的意思。

例子:

# 文件 t 的内容
111 222
222 aaa 

# 文件 t-c 的内容
222 333
333 444

# join 之后
join t t-c
# 输出
222 aaa  333

# 展示a的全部内容,并展示可以合并的内容
join -a 1 t t-c
# 输出
111 222
222 aaa  333

需要特别注意的是,在使用 join 之前,你所需要处理的文件应该要 事先经过排序 (sort) 处理! 否则有些比对的项目会被略过

paste

paste 就要比 join 简单多了!相对于 join 必须要比对两个文件的 数据相关性, paste 就直接“将两行贴在一起,且中间以 [tab] 键隔开”而已!

paste [-d] file1 file2

选项与参数:
-d :后面可以接分隔字符。默认是以 [tab] 来分隔的!
-  :如果 file 部分写成 - ,表示来自 standard input 的数据的意思。

split 将大文件分割

他可以帮你将一个大文件,依据文件大小或行数来分区,就可以将大文件 分区成为小文件了!

split [-bl] file PREFIX

选项与参数:
-b :后面可接欲分区成的文件大小,可加单位,例如 b, k, m 等;
-l :以行数来进行分区。
PREFIX :代表前置字符的意思,可作为分区文件的前导文字。

例子:使用 ls -al / 输出的信息中,每十行记录成一个文件

# 使用 ls -al / 输出的信息中,每十行记录成一个文件
ls -al / | split -l 10 - lsroot

# 统计文件信息
wc -l lsroot*

# 输出:
   10 lsrootaa
   10 lsrootab
   4 lsrootac
24 total

# 重点在那个 - 啦!一般来说,如果需要 stdout/stdin 时,但偏偏又没有文件, # 有的只是 - 时,那么那个 - 就会被当成 stdin 或 stdout。 这里就被当作标准输入了!

xargs 参数代换

更过操作可以查看 man xargs
xargs 可以读入 stdin 的数据,并且以空白字符或断行字符作 为分辨,将 stdin 的数据分隔成为 arguments 。
因为是以空白字符作为分隔, 所以,如果有一些文件名或者是其他意义的名词内含有空白字符的时候, xargs 可能就会误判了

xargs [-0epn] command

选项与参数:
-0 :如果输入的 stdin 含有特殊字符,例如 `, \, 空白键等等字符时,这个 -0 参数可以将他还原成一般字符。这个参数可以用于特殊状态喔!
-e :这个是 EOF (end of file) 的意思。后面可以接一个字符串,当 xargs 分析到这个字符串就会停止继续工作!
-p :在执行每个指令的 argument 时,都会询问使用者的意思;
-n :后面接次数,每次 command 指令执行时,要使用几个参数的意思。 
-I 替换字符: 在指令中对替换字符进行替换

当 xargs 后面没有接任何的指令时,默认是以 echo 来进行输出喔!

番外

关于减号(-)的使用

管线命令在 bash 的连续的处理程序中是相当重要的。在管线命令当中,常常 会使用到前一个指令的 stdout 作为这次的 stdin , 某些指令需要用到文件名称 (例如 tar) 来进行处理时,该 stdin 与 stdout 可以利用减号 “-” 来替代。

例如:

tar -cvf - /home | tar -xvf - -C /tmp/homeback

将 /home 里面的文件给他打包,但打包的数据不是 纪录到文件,而是传送到 stdout;
经过管线后,将 tar -cvf - /home 传送给 后面的 tar -xvf - ”。
后面的这个 - 则是取用前一个指令的 stdout, 因此, 我们就不需要使用 filename 了

你可能感兴趣的:(#,Linux,学习笔记,linux,服务器,网络)