linux 管道的几个练习

1.什么是linux管道:一个命令的输出(标准输出)被直接“用管道输送”到另一个命令的输入(标准输入)中,从而构成了linux(unix)的管道(pipe)--------摘自Redhat linux用户基础。

2.如何创建管道:为了用bash创建管道,用一个垂直的小节线 | 把这两个命令连接起来.

3.进程组:连接在管道的所有进程被称为进程组.

4.几个例子

例1.用户r正在寻找/etc目录下最大的文件,他先编写了find命令,列出所有大小超过100k字节的文件,如下:

find /etc -size +100k 2> /dev/null

直接结果如下:

/etc/ImageMagick-6/mime.xml
/etc/timidity/timgm6mb.cfg
/etc/ssl/certs/ca-certificates.crt
/etc/brltty/Contraction/zh-tw.ctb
/etc/brltty/Contraction/zh-tw-ucb.ctb
/etc/brltty/Contraction/ko.ctb
/etc/cups/ppd/CUPS-BRF-Printer.ppd.O
/etc/cups/ppd/CUPS-BRF-Printer.ppd
/etc/yozoXpack/902CCC39-02E3-4814-AF71-C25E6C685CB2/dispose.jar

find没有按照特定的顺序列出文件,现在用户r要对刚才的输出结果按照英文字母表排序------把find命令的输出用管道输出到sort命令的标准输入中,执行如下

r@r:~$ find /etc/ -size +100k 2> /dev/null | sort
/etc/brltty/Contraction/ko.ctb
/etc/brltty/Contraction/zh-tw.ctb
/etc/brltty/Contraction/zh-tw-ucb.ctb
/etc/cups/ppd/CUPS-BRF-Printer.ppd
/etc/cups/ppd/CUPS-BRF-Printer.ppd.O
/etc/ImageMagick-6/mime.xml
/etc/ssl/certs/ca-certificates.crt
/etc/timidity/timgm6mb.cfg
/etc/yozoXpack/902CCC39-02E3-4814-AF71-C25E6C685CB2/dispose.jar
r@r:~$ 

注意:sort命令默认是从标准输入读取数据的,此处利用了管道 | ,使得别的程序的标准输出传递给sort,作为sort的输入 ,充分体验了,管道| 就是把一个程序的标准输出输送到另一个程序的标准输入中。

5.grep:grep用来搜索和提取含有指定文本串的行。

grep 命令的第一个参数是被搜索的字符串,如果grep只有一个参数(被搜索的字符串),那么grep将把标准输入当成要操作的数据源。

比如用户r要打印/etc/passwd所有含有”root“的行,

例如:

r@r:~$ grep root
today ,i have learned that root can do much more things than general guest
today ,i have learned that root can do much more things than general guest
ok ,root is a super guest.
ok ,root is a super guest.

 也可以指定搜索的文件代替标准输入,例如

r@r:~$ grep root /etc/passwd
root:x:0:0:root:/root:/bin/bash
nm-openvpn:x:118:124:NetworkManager OpenVPN,,,:/var/lib/openvpn/chroot:/usr/sbin/nologin

grep很重要的应用是和管道结合,用grep 过滤查找结果(使得查找结果中查找和提取含有指定文本的行,也就是从查找结果中只打印含有指定文本的行)

例如,从计算机中查找含有字符串sales的文件,再从结果中过滤出含有data的行,如下

r@r:~$ find / -name *sales* 2> /dev/null | grep data
/home/r/coml/c++/11/11.3/11.3.1/5/sales_data.h
/home/r/coml/c++/11/11.3/11.3.1/5/sales_data.h.gch

注:上面的这句,因为没有给grep指定搜索的文件,所以grep把标准输入当成数据源,正好是find的结果用管道传递给他了
再比如,用户r想知道root出现在系统配置文件的哪些地方,所以他执行如下命令:

r@r:~$ grep root /etc/* 2> /dev/null
/etc/anacrontab:HOME=/root
/etc/anacrontab:LOGNAME=root
/etc/bash.bashrc:# set variable identifying the chroot you work in (used in the prompt below)
/etc/bash.bashrc:if [ -z "${debian_chroot:-}" ] && [ -r /etc/debian_chroot ]; then
/etc/bash.bashrc:    debian_chroot=$(cat /etc/debian_chroot)
/etc/bash.bashrc:  PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
/etc/bash.bashrc:	To run a command as administrator (user "root"), use "sudo 

follow is snip......
....................
....................
....................

结果太多了,他只想要结果中含有conf的行,所以对结果用管道和grep 进行过滤:

r@r:~$ grep root /etc/* 2> /dev/null | grep conf
/etc/ca-certificates.conf:mozilla/Comodo_AAA_Services_root.crt
/etc/ca-certificates.conf.dpkg-old:mozilla/Comodo_AAA_Services_root.crt
/etc/e2scrub.conf:# recipient=root
/etc/fuse.conf:# Set the maximum number of FUSE mounts allowed to non-root users.
/etc/fuse.conf:# Allow non-root users to specify the allow_other or allow_root mount options.
/etc/hdparm.conf:## the keyword 'command_line' are not run until after the root filesystem
/etc/hdparm.conf:## to run hdparm to set parameters for your root disk, please use the
/etc/logrotate.conf:su root adm
/etc/ltrace.conf:int   SYS_chroot(string);
/etc/updatedb.conf:PRUNEPATHS="/tmp /var/spool /media /var/lib/os-prober /var/lib/ceph /home/.ecryptfs /var/lib/schroot"
/etc/xattr.conf:xfsroot.*			skip		# xfs specific; obsolete

6.有效搜索历史记录:

在历史记录中查询含有find的命令:

r@r:~$ history | grep find
 1892  find / -name 'sales_data*' >& 1.cc
 1894  find / -name "sales_data*" >& 1.cc
 1898  find / -name *sales_data* >& 1.cc
 1900  find / -name *sales_data* 2>1.cc
 1901  find / -name *sales_data* 2> 1.cc
 1902  find / -name *sales_data* 2>&1 1.cc
 1903  find / -name *sales_data* 2>&1 
 1904  find / -name *sales_data* 1>&2
 1905  find / -name *sales_data* 2>1.cc
 1906  find / -name *sales_data* 1>1.cc
 1909  find / -name *sales_data* 1>1.cc
 1911  find / -name *sales_data* 2>1.cc
 1912  find / -name *sales_data* >Y1.cc
 1913  find / -name *sales_data* >&1.cc
 1914  find / -name *sales_data* 2>1.cc 2>&1
 1915  find / -name *sales_data* 2>1.cc 1>&2
 1917  find / -name *sales_data* 1>1.cc 2>&1
 1920  find / -name *sales_data* 1>1.cc 2>2.cc
 1924  find / -name *sales_data* > 1.cc 2>&1
 1925  find / -name *sales_data* > 1.cc 2>1
 1928  find / -name *sales_data* > 1.cc 2>&1
 1930  find /var -user r
 1931  find /var -user r 2>/dev/null
 1932  find /var -user r 2>/dev/null ls{}
 1933  find /var -user r 2>/dev/null exec ls{}
 1934  find /var -user r 2>/dev/null;exec ls{}
 1935  find /var -user r 2>/dev/null;exec ls -l {}
 1936  find /var -user r 2>/dev/null exec ls -l {}
 1961  find /etc
 1962  find /
 1963  find ~
 1964  find ~ >>& 1.c
 1965  find ~ >& 1.c
 1971  find / -name *sales_data* 2> /dev/null | sort
 1972  find ~ -user r 2> /dev/null | sort
 1973  find ~ -user r  -name "*保险*" 2> /dev/null | sort
 1998  find /etc -size +100k
 1999  find /etc -size +100k 2> /dev/null
 2000  find /etc/ -size +100k 2> /dev/null | sort
 2001  find /etc/ | grep root
 2022  find / -name r | grep r
 2023  find / -name r *sale* | grep data
 2024  find / -name  *sale* | grep data
 2025  find / -name  *sale* 2> /dev/null | grep data
 2026  find / -name *sales* 2> /dev/null | grep data
 2035  history | grep find

7.unit哲学,联合使用简单的工具

Linux和Unix一样,基本上以这条基础定律为基础:复杂的系统应该由简单的、专门的、互操作简单的组建构成。依据这条基本定律,许多标准的Linux程序被设计成过滤器,从一个标准 源读取数据,操作这些数据,并把结果传送到一个标准的目的地。

用户想看看/var/log下哪些文件含有DHCP这个字符串,所以他执行

r@r:/var/log$ grep DHCP /var/log/* 2>/dev/null
/var/log/syslog.1:Feb 16 17:41:28 r NetworkManager[799]: <info>  [1613468488.0950] dhcp-init: Using DHCP client 'internal'
/var/log/syslog.1:Feb 17 11:33:45 r NetworkManager[817]: <info>  [1613532825.9667] dhcp-init: Using DHCP client 'internal'

他找到了,原来在syslog.1中,他在syslog.1中继续搜索含有root的字符串,命令如下:

 

r@r:/var/log$ grep root /var/log/syslog.1
Feb 16 19:50:03 r rtkit-daemon[1176]: Successfully called chroot.
Feb 16 19:50:05 r eks.daemon-controller-manager[930]: --root-ca-file=${SNAP_DATA}/certs/ca.crt
Feb 16 19:50:05 r eks.daemon-controller-manager[930]: + exec /snap/eks/4/kube-controller-manager --kubeconfig=/var/snap/eks/4/credentials/controller.config --service-account-private-key-file=/var/snap/eks/4/certs/serviceaccount.key --root-ca-file=/var/snap/eks/4/certs/ca.crt --cluster-signing-cert-file=/var/snap/eks/4/certs/ca.crt --cluster-signing-key-file=/var/snap/eks/4/certs/ca.key --address=127.0.0.1 --use-service-account-credentials
Feb 16 19:50:06 r eks.daemon-containerd[928]: --root ${

以下省略
snip
..............................
..............................

linux管理员应该熟悉grep ,sed,awk,sort和unique,这几个,但是我好像只知道一点sort和grep,grep还有更难的部分。本节只是最简单的部分。grep简单查询和借助管道过滤查询信息。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

发狂的蜗牛

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

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

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

打赏作者

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

抵扣说明:

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

余额充值