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简单查询和借助管道过滤查询信息。