Linux 命令管道介绍

今天给伙伴们分享一下Linux 命令管道,希望看了有所收获。

我是公众号「想吃西红柿」「云原生运维实战派」作者,对云原生运维感兴趣,也保持时刻学习,后续会分享工作中用到的运维技术,在运维的路上得到支持和共同进步!

如果伙伴们看了文档觉得有用,欢迎大家关注我的公众号,获取相关文档。爱运维,爱生活。

一、进程管道技术

  • 管道操作符号 “|” 连接左右两个命令, 将左侧的命令的标准输出, 交给右侧命令的标准输入

图片

  • 格式: cmd1 | cmd2 […|cmdn]

1、匿名管道

[root@edenluo.com ~]# ll /dev/ | less
[root@edenluo.com ~]# ps aux | grep 'sshd'
[root@edenluo.com ~]# rpm -qa  | grep 'httpd'   //查询所有安装的软件包,过滤包含httpd的包
[root@edenluo.com ~]# yum list  | grep 'httpd'

2、命名管道(了解)

创建命名管道文件:
[root@edenluo.com ~]# mkfifo /tmp/tmpfifo
[root@edenluo.com ~]# file /tmp/tmpfifo
/tmp/tmpfifo: fifo (named pipe)

把指令结果放入管道先:
[root@edenluo.com ~]# rpm -qa > /tmp/tmpfifo 

新建一个终端从命名管道内拿内容:
[root@edenluo.com ~]# grep bash /tmp/tmpfifo 
bash-4.1.2-14.el6.x86_64

把指令结果放入管道先:
[root@edenluo.com ~]# cat /etc/passwd > /tmp/tmpfifo 

新建一个终端从命名管道内拿内容:
[root@edenluo.com ~]# grep root /tmp/tmpfifo 
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

3、管道练习实例

1、案例1: 将/etc/passwd 中的用户按 UID 大小排序
[root@edenluo.com ~]# sort -t":" -k3 -n /etc/passwd 
[root@edenluo.com ~]# sort -t":" -k3 -n /etc/passwd -r 
[root@edenluo.com ~]# sort -t":" -k3 -n /etc/passwd |head

-t: 用来指定分隔符   -k  指定列数   -n  以数值的方式排序
2、案例2: 统计出最占CPU的5个进程
[root@edenluo.com ~]# ps aux --sort=-%cpu |head -6

-%cpu 是从大到小(倒序) +%cpu 从小到大(正序)
3、案例3:统计当前/etc/passwd中用户使用的shell类型(目前了解)
思路:取出第七列(shell) | 排序(把相同归类)| 去重
[root@edenluo.com ~]# awk -F: '{print $7}' /etc/passwd
[root@edenluo.com ~]# awk -F: '{print $7}' /etc/passwd |sort
[root@edenluo.com ~]# awk -F: '{print $7}' /etc/passwd |sort |uniq 
[root@edenluo.com ~]# awk -F: '{print $7}' /etc/passwd |sort |uniq -c
    131 	/bin/bash
      1 	/bin/sync
      1 	/sbin/halt
     63 	/sbin/nologin
      1 	/sbin/shutdown
-F: 	指定字段分隔符
$7 		第七个字段
4、案例4: 统计网站的访问情况 top 20(目前了解)
思路:打印所有访问的连接 | 过滤访问网站的连接 | 打印用户的IP | 排序 | 去重
[root@edenluo.com ~]# yum -y install httpd
[root@edenluo.com ~]# systemctl start httpd
[root@edenluo.com ~]# systemctl stop firewalld

[root@edenluo.com ~]# ss -an |grep :80 |awk -F":" '{print $8}' |sort |uniq -c
	4334 192.168.0.66
	1338 192.168.10.11
	1482 192.168.10.125
  44 	 192.168.10.183
  3035 192.168.10.213
  375  192.168.10.35
  362  192.168.10.39

[root@edenluo.com ~]# ss -an |grep :80 |awk -F":" '{print $8}' |sort |uniq -c |sort -k1 -rn |head -n 20 
5、案例5: 打印当前所有IP(目前了解)
[root@edenluo.com ~]# ip addr |grep 'inet ' |awk '{print $2}' |awk -F"/" '{print $1}'
127.0.0.1
192.168.2.115
6、案例6:打印根分区已用空间的百分比(仅打印数字)(目前了解)
[root@edenluo.com ~]# df -P |grep '/$' |awk '{print $5}' |awk -F"%" '{print $1}'

4、tee管道技术(了解)

图片

  • Linux tee命令用于读取标准输入的数据,并将其内容输出成文件。

  • tee指令会从标准输入设备读取数据,将其内容输出到标准输出设备,同时保存成文件。

语法

[root@edenluo.com ~]# tee [-ai][--help][--version][文件...]

参数

  • -a或–append  附加到既有文件的后面,而非覆盖它.
  • -i或–ignore-interrupts  忽略中断信号。
  • –help  在线帮助。
  • –version  显示版本信息。

实例

[root@edenluo.com ~]# date > date.txt 
[root@edenluo.com ~]# date |tee date.txt

使用指令"tee"将用户输入的数据同时保存到文件"file1"和"file2"中,输入如下命令:

[root@edenluo.com ~]# tee file1 file2                   #在两个文件中同时输入内容内容 

以上命令执行后,将提示用户输入需要保存到文件的数据,如下所示:

My Linux                        #提示用户输入数据  
My Linux                        #输出数据,进行输出反馈  

此时,可以分别打开文件"file1"和"file2",查看其内容是否均是"My Linux"即可判断指令"tee"是否执行成功。

5、参数传递xargs(了解)

  • 将参数列表转换成小块分段传递给其他命令
  • 读入stdin的数据转换为参数添加至命令后面
  • 让一些不支持管道的命令可以使用管道。
  • 管道命令符能让大家能进一步掌握命令之间的搭配使用方法,进一步提高命令输出值的处理效率。
  • xargs 是给命令传递参数的一个过滤器,可以将管道或标准输入的数据转换成参数,默认的命令是 echo
[root@edenluo.com ~]# grep "/sbin/nologin" /etc/passwd | wc -l
33
[root@edenluo.com ~]# head -5 /etc/passwd|tail -1
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
使用grep过滤输出信息
[root@edenluo.com ~]# ls -l /etc |grep pass
-rw-r--r--   1 root root   4653 Dec  2 15:54 passwd
-rw-r--r--.  1 root root   4606 Dec  2 15:54 passwd-
-rw-r--r--.  1 root root   1454 Sep 23  2014 passwd.OLD
//管道和标准输出以及标准错误输出, 使用普通用户执行如下命令
[root@edenluo.com ~]# find /etc/ -name "p*"|grep passwd
[root@edenluo.com ~]# find /etc/ -name "p*"|grep passwd > a
[root@edenluo.com ~]# find /etc/ -name "p*"|grep passwd > b
[root@edenluo.com ~]# find /etc/ -name "p*"|grep passwd &> ab

[root@edenluo.com ~]# find  .  -name wing.txt | xargs  -i cp {} /root/Desktop
加-i 参数直接用 {}就能代替管道之前的标准输出的内容

[root@edenluo.com ~]# find  .  -name wing.txt | xargs  -i cp {} /root/Desktop
防止被查找到的文件过多,导致内存溢出错误

i缺省使用{}作为占位符

[root@localhost ~]# echo "a b c d aa bb abc"|xargs -t touch 
[root@edenluo.com ~]# ls *a | xargs -i echo {}

通过-I指定占位符,自定义占位符

[root@edenluo.com ~]# ls *a | xargs -I % echo %
[root@localhost ~]# echo "file1 file2 file3"|xargs -t -I % sh -c 'touch %;ls -l %'

二、命令管道实战练习

1、简述输出/输入重定向的意义。

2、使用 > ,>> , 2>,2>> , <, 练习重定向的使用。

3、简述管道的作用。

4、举例练习管道 | 和xargs的使用。

5、破解centos7/8密码

grub界面--> e --> vmlinuz那行最后添加 init=/bin/sh --> ctrl+x --> # mount -o remount,rw / 

如果有版帮助,帮忙免费的关注一下**公众号「想吃西红柿」「云原生运维实战派」**后续会有更多实用的运维技术分享给伙伴们,您的关注就是我最大的成就。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

尘嫣慕曦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值