linux管道介绍和使用

#管道介绍
在 Linux 系统中,管道(Pipe)是一种强大且常用的机制,用于在不同的命令之间传递数据。管道是一种进
程间通信(IPC)的方式,它允许将一个命令的标准输出直接作为另一个命令的标准输入。通过管道,可以将多
个简单的命令组合起来,形成功能强大、复杂的操作。 


#工作原理
管道在内存中创建一个缓冲区,第一个命令(生产者)将输出数据写入这个缓冲区,第二个命令(消费者)从缓
冲区中读取数据作为输入。这样,数据就可以在不同的命令之间依次传递和处理,而不需要将中间结果保存到磁盘文件中。

#使用方法
在 Linux 中,管道使用竖线符号 | 来表示。基本语法如下:
command1 | command2 | command3 ...
#单重管道示例-筛选ip地址的行
使用 ip address 命令查看ip地址,然后通过管道将其输出传递给 grep 命令进行[root@xzq-almalinux ~]# ip address 
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:0c:29:9f:6f:55 brd ff:ff:ff:ff:ff:ff
    altname enp3s0
    inet 192.168.1.106/24 brd 192.168.1.255 scope global dynamic noprefixroute ens160
       valid_lft 5756sec preferred_lft 5756sec
    inet6 fe80::20c:29ff:fe9f:6f55/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
3: ens192: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:0c:29:9f:6f:5f brd ff:ff:ff:ff:ff:ff
    altname enp11s0
4: ens224: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:0c:29:9f:6f:69 brd ff:ff:ff:ff:ff:ff
    altname enp19s0

[root@xzq-almalinux ~]# ip address | grep "inet"
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host 
    inet 192.168.1.106/24 brd 192.168.1.255 scope global dynamic noprefixroute ens160
    inet6 fe80::20c:29ff:fe9f:6f55/64 scope link noprefixroute 选:

#多重管道示例-筛选ip地址和网卡名称
假设你面前有一排苹果,从左到右依次编号:第 1 个、第 2 个、第 3 个…… 最后一个。

    NF 就像是在告诉你 “这一排总共有多少个苹果”(比如总共有 5 个)。
    $ 在 awk 里的作用,就相当于 “第 X 个” 中的 “第 X 个” 这个说法。比如 $3 就是 “第 3 个苹果”。

现在,$NF 就是把两者结合起来:
如果 NF 告诉你 “总共有 5 个苹果”,那么 $NF 就是 “第 5 个苹果”—— 而第 5 个正是最后一个。
 
[root@xzq-almalinux ~]# ip address | grep "inet " |awk '{print $NF,$2}' |grep -E "ens|eth"
ens160 192.168.1.106/24
 
#tee命令
tee命令主要功能是从标准输入读取数据,并将这些数据同时输出到标准输出(通常是终端屏幕)和一个或多个
文件中。在执行复杂命令或脚本时,使用 tee 可以方便地记录命令的输出结果,同时在屏幕上查看执行情况。 
 
[root@xzq-almalinux ~]# ip address | grep "inet " |awk '{print $NF,$2}' | tee nic-name-address-lo.txt | grep lo -v | tee nic-name-address.txt
ens160 192.168.1.106/24 

[root@xzq-almalinux ~]# cat nic-name-address-lo.txt 
lo 127.0.0.1/8
ens160 192.168.1.106/24
[root@xzq-almalinux ~]# cat nic-name-address.txt 
ens160 192.168.1.106/24

-a(--append):以追加模式打开文件,若文件已存在,新的数据会添加到文件末尾,而非覆盖原有内容。
-i(--ignore-interrupts):忽略中断信号,在执行过程中即使收到中断信号(如 Ctrl + C),tee
也不会停止。 

 
[root@xzq-almalinux ~]# ls | tee /tmp/saved-output1 /tmp/saved-output2
 
ls:核心命令,用于列出当前工作目录下的所有文件和子目录(默认不显示隐藏文件,即开头为.的文件)。
|(管道符):将 ls 命令的输出内容,传递给后面的 tee 命令处理,而不是只在终端显示。
tee /tmp/saved-output1 /tmp/saved-output2:

    tee 命令的核心作用是 “双向输出”:既把接收到的内容显示在终端上,又把内容写入指定的文件。
    这里指定了两个文件路径(/tmp/saved-output1 和 /tmp/saved-output2),意味着 ls 的输出会同时写入这两个文件,且两个文件内容完全相同。

 
管道(|)本身是 “单向传输内容” 的通道,而 tee 就像在这个通道上开了几个 “分支口子”,让原本只往一个方向走的内容,同时往多个方向输送。

#xargs命令 
xargs命令主要功能是从标准输入读取数据,然后将这些数据拆分成一个个参数,传递给其他命令进行处理。

在 Linux 里,很多命令无法直接从标准输入接收多个参数,只能以命令行参数的形式接收。xargs 命令就起
到了一个桥梁的作用,它会读取标准输入的数据,默认以空格、制表符或换行符作为分隔符,将数据分割成多个
参数,再把这些参数传递给指定的命令执行。


command | xargs [选项] [其他命令]


[root@xzq-almalinux ~]# ls *.txt | grep nic
nic-name-address-lo.txt
nic-name-address.txt
[root@xzq-almalinux ~]# ls *.txt | grep nic | cat 
nic-name-address-lo.txt
nic-name-address.txt

[root@xzq-almalinux ~]# ls *.txt | grep nic | xargs
nic-name-address-lo.txt nic-name-address.txt
[root@xzq-almalinux ~]# ls *.txt | grep nic | xargs cat
lo 127.0.0.1/8
ens160 192.168.1.106/24
ens160 192.168.1.106/24

单独用 xargs 就是这两个核心点:只接紧邻管道的结果,多内容自动用空格分隔成单行!
xargs 本质就是 “参数传递工具”,单独用毫无实战意义
必须配合其他命令才能发挥价值—— 它的使命就是把前序命令的输出,变成后续命令的 “弹药(参数)”,批量完成操作! 

#适合管道的一些linux命令
1.wc
wc英文全称为 "word count",主要用于统计文件中的行数、单词数和字节数。
-l:仅统计行数。
-w:仅统计单词数。
-c:仅统计字节数。
-m:统计字符数,在某些字符编码下,字符数和字节数可能不同。
-L:显示文件中最长行的长度。 

[root@xzq-almalinux ~]# cat /etc/passwd |wc -l
35

2.sort
sort 命令可以对文件或标准输入的内容进行排序,并将排序结果输出。

若不指定文件,sort 会从标准输入读取内容进行排序;若指定了一个或多个文件,sort 会对这些文件的内容
进行排序。 

默认情况下,sort 按字典序对文本行进行排序。
假设 words.txt 文件内容如下

[root@xzq-almalinux ~]# cat words.txt 
banana
apple
cherry
[root@xzq-almalinux ~]# sort words.txt 
apple
banana
cherry 

使用 -r 选项可以实现逆序排序,即从大到小排序
使用 -n 选项可以按数字大小进行排序,而不是按字典序
使用 -f 选项可以忽略大小写进行排序
使用 -u 选项可以在排序的同时去除重复的行

3.uniq
uniq 英文全称为 “unique”,它能够帮助用户对文本数据进行清理和整理,使输出结果更加简洁。


uniq [选项] [输入文件 [输出文件]] 


若不指定输入文件,uniq 会从标准输入读取内容;若不指定输出文件,处理结果会输出到标准输出。

-c:在每行前加上该行在文件中出现的次数。
-d:只输出重复的行。
-u:只输出不重复的行。
-i:忽略大小写进行比较。

 假设存在一个名为 test1.txt 的文件,内容如下:
[root@xzq-almalinux ~]# cat test1.txt 
apple
apple
banana
cherry
cherry
cherry 

#使用uniq命令去除相邻的重复行:
[root@xzq-almalinux ~]# uniq test1.txt 
apple
banana
cherry

#统计重复行的数量 
[root@xzq-almalinux ~]# uniq -c test1.txt 
      2 apple
      1 banana
      3 cherry 


#只输出重复的行
[root@xzq-almalinux ~]# uniq -d test1.txt 
apple
cherry


#只输出不重复的行
[root@xzq-almalinux ~]# uniq -u test1.txt 
banana 


假设 test2.txt 文件内容为:
[root@xzq-almalinux ~]# cat test2.txt
Apple
apple
banana
Cherry
cherry 


#使用 -i 选项忽略大小写进行比较:
[root@xzq-almalinux ~]# uniq -i -c test2.txt
      2 Apple
      1 banana
      2 Cherry 

uniq 命令只能去除相邻的重复行,如果文件中的重复行不相邻,需要先使用 sort 命令对文件进行排序,再
使用 uniq 命令。例如:

[root@xzq-almalinux ~]# sort test1.txt | uniq
apple
banana 
cherry 


在处理日志文件时,去除重复的日志记录,使日志更加简洁,便于分析。
在处理大量数据时,去除重复的数据行,提高数据的质量和处理效率。


4.tr
tr 是 Linux 和类 Unix 系统中一个用于字符转换、删除和压缩的命令,其英文全称为 “translate”。它
可以对标准输入的字符进行替换、删除或压缩等操作,并将结果输出到标准输出。

tr [选项] '字符集1' '字符集2' 


字符集1 是需要被转换或删除的字符集合,字符集2 是用于替换 字符集1 中字符的字符集合。若只指定 字符
集1 而不指定 字符集2,tr 会删除输入中所有属于 字符集1 的字符。

常用选项
-d:删除字符集 1 中包含的所有字符
-s:压缩字符集 1 中连续重复的字符(仅保留一个) 
-c:对字符集 1 取反(匹配不在字符集 1 中的所有字符),需与其他选项配合使用
-cd:结合 -c(取反)和 -d(删除),仅保留字符集 1 中的字符,删除其余所有字符

#将输入中的小写字母转换为大写字母
[root@xzq-almalinux ~]# echo  "hello world" | tr 'a-z' 'A-Z'
HELLO WORLD

#删除输入中的所有数字
[root@xzq-almalinux ~]# echo "abc123def" | tr -d "0-9"
abcdef 

#压缩输入中连续重复的空格为单个空格
[root@xzq-almalinux ~]# echo "hello     world" | tr -s ' '
hello world

只要 tr -s ' ' 里指定的是空格(引号内是 ' '),不管有多少个连续空格(2 个、5 个、10 个都算),都会统一压缩成 1 个。

#将输入中除了数字以外的所有字符替换为 X
[root@xzq-almalinux ~]# echo "abc123defg" | tr -c '0-9' 'X'; echo
XXX123XXXXX


tr 支持使用字符类来表示一组字符,例如 [:upper:] 表示所有大写字母,[:lower:] 表示所有小写字
母,[:digit:] 表示所有数字等  
[root@xzq-almalinux ~]# echo "HELLO WORLD" | tr [:upper:] [:lower:]
hello world

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值