一点一滴学Linux

    返回首页    发表留言
本文作者:李德强
          第五节 重定向与管道
 
 

一、重定向

        在Linux中标准输入、输出为键盘输入和显示器输出。对于echo命令可以在标准输出设备上显示一些内容,比如:

echo "Hello World!"
Hello World!

        这就是标准输出。但是标准输出并不是echo的唯一输出目的地。可以通过>符号来重定向echo的输出设备,比如:

echo "Hello World!" > hw
ls -l
-rw-rw-r--. 1 lidq lidq 13 Mar 31 12:48 hw
cat hw
Hello World!

        这就是使用了>符号来将echo这个命令的输出重定向到文件hw中,也就是将Hello World!内容写入了文件hw中。同理,命令的标准输入也可以被重定向为文件输入。

二、管道

        在Linux中使用管道符号|将两个命令分别隔开,将前一个命令的输入重定向到后一个命令的输入。也就是说在Linux下可以通过管道机制执行多个命令,它们之间都用|符号隔开。前一个命令的输入被重定向到后一个命令的输入,数据就像在一个管道里流动一样,从管道的入口流向出口。比如在~/Documents/books下有3个文本文件test1.txt、test2.txt、test3.txt里面的内容分别为aaa、bbb、ccc。执行下面命令:

find ~/Documents/books -name *.txt | grep -i test2 | cat > test.log
cat test.log
/home/lidq/Documents/books/test2.txt

        首先在~/Documents/books中查找其下的以.txt结尾的文件列表,再将这个输出结果重定向到grep;在结果中查找test2的字符串,并将结果重定向到cat中;cat命令显示这个结果并重定向到test.log文件中。test.log文件的内容为test2.txt。

        注意:第2步grep命令所查找的内容是:

"/home/lidq/Documents/books/test2.txt
 /home/lidq/Documents/books/test1.txt
 /home/lidq/Documents/books/test3.txt"

        这个字符串,而不是这几个文件的内容。那么问题来了,如果想要在这几个文件的内容中查找一个字符串,应该怎么办呢?答案是使用xargs:

find ~/Documents/books -name *.txt | xargs grep test2

        在这些文件内容中查找test2,没有任何结果。

find ~/Documents/books -name *.txt | xargs grep aaa
/home/lidq/Documents/books/test1.txt:aaa

        在这些文件内容中查找aaa,查找到了一个结果。

        有了重定向和管道机制,就可以做一些功能非常强大的命令组合,比如:

        查找所有的wine进程,并强制杀死它们:

ps -ef | grep wine | grep -v grep | awk '{print $2}' | xargs kill -9

        删除某个目录及其下子目录中所有的png文件:

find Pictures/ -iname "*.png" | xargs rm -rvf
removed ‘Pictures/icon/eclipse.png’
removed ‘Pictures/icon/qq.png’
removed ‘Pictures/icon/sqldeveloper.png’
removed ‘Pictures/background/FootFall.png’
removed ‘Pictures/Selection_001.png’
removed ‘Pictures/Selection_003.png’

        查找/etc下及其下子目录中所有的conf文件并将结果写入log文件:

find /etc -iname "*.conf" | grep -i network > log
cat log
/etc/dbus-1/system.d/org.freedesktop.NetworkManager.conf
/etc/NetworkManager/NetworkManager.conf
/etc/NetworkManager/conf.d/20-connectivity-fedora.conf

        统计某个C语言工程头文件和源代码文件的总行数:

find . -iname "*.[h|c]" | xargs wc -l
22347 total

        注意,在使用wc统计命令时要使用xargs命令,不然就变成了这个目录下一共有多少个h和c文件,而不是统计代码的行数了。

find . -iname "*.[h|c]" | wc -l
106

        使用wc统计时没有使用xargs命令,变成是统计这个工程下一共有多少个h和c文件。

    返回首页    返回顶部
  看不清?点击刷新

 

  Copyright © 2015-2018 问渠网 辽ICP备15013245号