linux管道及重定向

一 .管道及重定向

I/O重定向

I/O  Input/Output  Redirection

标准输入、标准输出、标准错误 

输出重定向及综合案例

输入重定向及结合案例

标准输入、标准输出、标准错误
file descriptors (FD,文件描述符 或  Process I/O channels): 进程使用文件描述符来管理打开的文件
[root@youngfitn ~]# ls /proc/$$/fd 
0  1  2  3  4

0, 1, and 2, known as standard input, standard output, and standard error

输出重定向 (覆盖,追加)

正确输出: 1> 1>> 等价于 >覆盖 >> 追加 命令结果能够正确的显示

错误输出: 2> 2>> 命令结果不能正确的显示或者命令错误

​ 如果不加012 ,则>默认是1 使用时,会将正确的接受,错误的报错

1.1. 案例1:输出重定向(覆盖)
 [root@youngfitn ~]# date 1> date.txt
 [root@youngfitn ~]# date > date.txt
1.2.案例2:输出重定向(追加)
[root@youngfitn ~]# date >> date.txt
1.3. 案例3:错误输出重定向
[root@youngfitn ~]# ls /home/  /aaaaaaaaa >list.txt
ls: cannot access /aaaaaaa: No such file or directory

[root@cuichengjie ~]# cat list.txt
/home/:
cuichengjie4

如果不加012 ,则>默认是1     使用时,会将正确的接收,错误的报错

ls: 无法访问/aaaaaaaaa: 没有那个文件或目录

[root@youngfitn ~]# ls /home/  /aaaaaaaaa >list.txt 2>error.txt

[root@cuichengjie ~]# cat list.txt  //接受了正确的结果
/home/:
cuichengjie4
[root@cuichengjie ~]# cat error.txt //接收了错误的结果
ls: cannot access /aaaaaaa: No such file or directory

list会接收正确的结果,error会接收错误的结果,

//重定向到不同的位置

1.4.正确和错误都输入到相同位置
[root@youngfitn ~]# ls /home/  /aaaaaaaaa &>list.txt    //混合输出,将正确和错误的内容一同输入到list里
[root@cuichengjie ~]# cat list.txt  //将正确和错误de
ls: cannot access /aaaaaa: No such file or directory
/home/:
cuichengjie4

1.5. 正确和错误都输入到相同位置
 [root@youngfitn ~]# ls /home/  /aaaaaaaaa >list.txt 2>&1               //重定向到相同的位置   ,与上面的结果相同
$?是返回上一次命令返回的值,如果是0则上条命令成功,如果不是则代表失败。
-ep 在if语句中是 等于  的意思

1.6.脚本中使用重定向
[root@youngfitn ~]# vim ping1.sh 
ping -c1 10.18.40.100

if [ $? -eq 0 ];then       

  echo "10.18.40.100 is up."

else        

  echo "10.18.40.100 is down!" 

fi

[root@youngfitn ~]# chmod +x ping1.sh

[root@youngfitn ~]# ./ping1.sh  ./是当前目录

1.7.脚本中使用重定向
[root@youngfitn ~]# vim ping1.sh

ping -c1 10.18.40.100 &>/dev/null

f [ $? -eq 0 ];then      

   echo "10.18.40.100 is up." 

else        

   echo "10.18.40.100 is down!"

fi

案例8:脚本中使用重定向

[root@youngfitn ~]# vim ping2.sh 

 ping -c1 10.18.40.100 &>/dev/null

 if [ $? -eq 0 ];then    

     echo "10.18.40.100 is up." >>up.txt

 else       

     echo "10.18.40.100 is down!" >>down.txt

fi

[root@youngfitn ~]# chmod +x ping2.sh  

[root@youngfitn ~]# ./ping2.sh 

二.输入重定向

标准输入: < 等价 0<

a.案例1:

mailx sendmail 下载这两个
[root@youngfitn ~]# mail alice                       //没有改变输入的方向,默认键盘

 Subject: hello

 1111

 2222

 3333

 .

 EOT



[root@youngfitn ~]# su - alice
[alice@youngfitn ~]$ mail
Heirloom Mail version 12.5 7/5/10.  Type ? for help.
"/var/spool/mail/alice": 1 message 1 new

 N  1 root                  Mon Jul 31 15:16  20/617   "hello"

[root@youngfitn ~]# mail -s "test01" alice < /etc/hosts //输入重定向,来自于文件

b.案例2:

[root@youngfitn ~]# grep 'root'                                //没有改变输入的方向,默认键盘,此时等待输入... 
yang sss sssrootssss..

 sssrootssss..  
     
[root@youngfitn ~]# grep 'root' < /etc/passwd 
root:x:0:0:root:/root:/bin/bash 
operator:x:11:0:operator:/root:/sbin/nologin


案例3

[root@youngfitn ~]# dd if=/dev/zero of=/file1.txt bs=1M count=2 
2+0 records in
2+0 records out
2097152 bytes (2.1 MB) copied, 0.102506 s, 20.5 MB/s

[root@youngfitn ~]# dd /file2.txt bs=1M count=20 ///dev/zero设备
20+0 records in
20+0 records out
20971520 bytes (21 MB) copied, 1.6705 s, 12.6 MB/s


案例4:mysql表结构导入

[root@youngfitn ~]# yum -y install mariadb-server mariadb
[root@youngfitn ~]# systemctl start mariadb
[root@youngfitn ~]# vim bbs.sql
create database qf;
create table qf.t1 (id int);
insert into qf.t1 values(1);

[root@youngfitn ~]# mysql  show databases;
MariaDB [(none)]> \q

c 案例5:at

[root@youngfitn ~]# at now +5 min /延时5分钟的命令

at> useradd yang99  //延时5分钟创建yang99这个账户

at>  

job 1 at Mon Jul 31 15:29:00 2017 

[root@youngfitn ~]# vim at.txt  
useradd yang100 
useradd yang102

[root@youngfitn ~]# at now +2 min 

综合案例1: 利用重定向建立多行的文件

[root@youngfitn ~]# echo "111" > file1.txt
[root@youngfitn ~]# cat file1.txt  
111


[root@cuichengjie ~]# cat >file2.txt
111
22
333
444
^D

[root@cuichengjie ~]# cat file2.txt 
111
22
333
444


请问:file2.txt有几行?

[root@youngfitn ~]# cat >>file3.txt 
aaa 
bbb 
ccc 
ddd 
^D

[root@youngfitn ~]# cat file3.txt 
aaa
bbb
ccc
ddd


请问:file3.txt有几行?

[root@youngfitn ~]# cat >file4 <

的文件

[root@youngfitn ~]# vim create_file.sh

cat >file200.txt <

综合案例3: 脚本中利用重定向打印消息

[root@youngfitn ~]# cat create_file.sh

cat <<-EOF

111

222

333

yyy

ccc 

EOF

[root@youngfitn ~]# bash create_file.sh 

111 

222

333 

yyy

ccc



综合案例4

[root@youngfitn ~]# ls; date &>/dev/null                                      //会先执行ls,再执行;后面的语句

[root@youngfitn ~]# ls &>/dev/null; date &>/dev/null

[root@youngfitn ~]# (while :; do date; sleep 2; done) &               //在后台运行,但输出依然在前台终端

Sun Jul 21 16:16:25 CST 2019
Sun Jul 21 16:16:27 CST 2019
Sun Jul 21 16:16:29 CST 2019
Sun Jul 21 16:16:31 CST 2019
Sun Jul 21 16:16:33 CST 2019
Sun Jul 21 16:16:35 CST 2019
Sun Jul 21 16:16:37 CST 2019
Sun Jul 21 16:16:39 CST 2019
Sun Jul 21 16:16:41 CST 2019

[root@youngfitn ~]# (while :; do date; sleep 2; done) &>date.txt &  第一个&是混合输出,第二个是放在后台运行

[root@youngfitn ~]# tailf date.txt      //实时查看文件的内容,实时查看文档的后十行
Sun Jul 21 16:17:23 CST 2019
Sun Jul 21 16:17:25 CST 2019
Sun Jul 21 16:17:27 CST 2019
Sun Jul 21 16:17:29 CST 2019
Sun Jul 21 16:17:31 CST 2019
Sun Jul 21 16:17:33 CST 2019
Sun Jul 21 16:17:35 CST 2019
Sun Jul 21 16:17:37 CST 2019
Sun Jul 21 16:17:39 CST 2019
Sun Jul 21 16:17:41 CST 2019
Sun Jul 21 16:17:43 CST 2019
Sun Jul 21 16:17:45 CST 2019
Sun Jul 21 16:17:47 CST 2019

[root@youngfitn ~]# jobs
[1]+  运行中               ( while :; do
    date; sleep 2;
done ) &>/date.txt &

[root@youngfitn ~]# kill %1         //杀掉后台进程
[root@youngfitn ~]# jobs            //查看后台进程


三. 进程管道Piping

• Use redirection characters to control output to files.

• Use piping to control output to other programs.

files: > 2> file1.txt /dev/pts/2 /dev/tty1 /dev/null /dev/sda programs: |

进程管道

用法:command1 | command2 |command3 |

[root@youngfitn ~]# ll /dev/ |less

[root@youngfitn ~]# ps aux |grep 'sshd'
root       1099  0.0  0.0 105996   648 ?        Ss   08:13   0:00 /usr/sbin/sshd -D
root       6082  0.0  0.5 147788  5228 ?        Ss   13:12   0:01 sshd: root@pts/1
root       7787  0.0  0.0 112660   972 pts/1    R+   14:56   0:00 grep --color=auto sshd

[root@youngfitn ~]# rpm -qa  |grep 'httpd'    //查询所有安装的软件包,过滤包含httpd的包
httpd-tools-2.4.6-90.el7.centos.x86_64
httpd-2.4.6-90.el7.centos.x86_64

[root@youngfitn ~]# yum list  |grep 'httpd'  过滤YUM下载列表中的httpd
httpd.x86_64                                2.4.6-90.el7.centos        @base    
httpd-tools.x86_64                          2.4.6-90.el7.centos        @base    
httpd-devel.x86_64                          2.4.6-90.el7.centos        base     
httpd-manual.noarch                         2.4.6-90.el7.centos        base     
keycloak-httpd-client-install.noarch        0.8-1.el7                  base     
libmicrohttpd.i686                          0.9.33-2.el7               base     
libmicrohttpd.x86_64                        0.9.33-2.el7               base     
libmicrohttpd-devel.i686                    0.9.33-2.el7               base     
libmicrohttpd-devel.x86_64                  0.9.33-2.el7               base     
libmicrohttpd-doc.noarch                    0.9.33-2.el7               base     
python2-keycloak-httpd-client-install.noarch


案例1:将/etc/passwd中的用户按UID大小排序

[root@youngfit ~]# cat a.txt 
1:h
2:h
3:h
4:h
5:h
6:h
7:h
8:h
9:h
10:h
[root@youngfitn ~]# sort -t":" -k3 -n  a.txt            //以: 分隔,将第三列按字数升序

[root@cuichengjie opt]# cat create_file.sh 
cat <<-EOF
111
222
333
yyy
ccc
EOF
[root@cuichengjie opt]# sort -t":" -k3 -n create_file.sh 
111
222
333
cat <<-EOF
ccc
EOF
yyy

[root@youngfitn ~]# sort -t":" -k3 -n  a.txt -r         //-r  逆序 
yyy
EOF
ccc
cat <<-EOF
333
222
111

[root@youngfitn ~]# sort -t":" -k3 -n  a.txt |head  //-t 指定字段分隔符 -k 指定列 -n 按数值
111
222
333
cat <<-EOF
ccc
EOF
yyy


案例2:统计出最占CPU的5个进程

[root@youngfitn ~]# ps aux --sort=-%cpu |head -6 
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root       1801  0.5 12.9 1618752 129260 ?      Sl   08:15   2:13 /usr/bin/gnome-shell
mysql      7548  0.2  8.0 968828 80584 ?        Sl   14:40   0:02 /usr/libexec/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysql/plugin --log-error=/var/log/mariadb/mariadb.log --pid-file=/var/run/mariadb/mariadb.pid --socket=/var/lib/mysql/mysql.sock
root       1283  0.1  1.9 288024 19776 tty1     Ssl+ 08:13   0:32 /usr/bin/X :0 -background none -noreset -audit 4 -verbose -auth /run/gdm/auth-for-gdm-alsshx/database -seat seat0 -nolisten tcp vt1
root          1  0.0  0.6 128096  6596 ?        Ss   08:13   0:03 /usr/lib/systemd/systemd --system --deserialize 13
root          2  0.0  0.0      0     0 ?        S    08:13   0:00 [kthreadd]


案例3:统计当前/etc/passwd中用户使用的shell类型

思路:取出第七列(shell) | 排序(把相同归类)| 去重

[root@youngfitn ~]# awk -F: '{print $7}' /etc/passwd
/bin/bash
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
/bin/sync
/sbin/shutdown
/sbin/halt
...
[root@youngfitn ~]# awk -F: '{print $7}' /etc/passwd |sort          //sort分类
/bin/bash
/bin/bash
/bin/bash
/bin/sync
/sbin/halt
/sbin/nologin
/sbin/nologin
...
[root@youngfitn ~]# awk -F: '{print $7}' /etc/passwd |sort |uniq  //uniq去重
/bin/bash
/bin/sync
/sbin/halt
/sbin/nologin
/sbin/shutdown

[root@youngfitn ~]# awk -F: '{print $7}' /etc/passwd |sort |uniq -c   //去重并统计类别的数量
      3 /bin/bash
      1 /bin/sync
      1 /sbin/halt
     37 /sbin/nologin
      1 /sbin/shutdown


-F: 指定字段分隔符

$7 第七列字段

案例4: 统计网站的访问情况 top 20 思路: 打印所有访问的连接 | 过滤访问网站的连接 | 打印用户的IP | 排序 | 去重

[root@youngfitn ~]# yum -y install httpd 

[root@youngfitn ~]# systemctl start httpd

[root@youngfitn ~]# systemctl stop firewalld

[root@youngfitn ~]# 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@youngfitn ~]# ss -an |grep :80 |awk -F":" '{print $8}' |sort |uniq -c |sort -k1 -rn |head -n 20

案例5: 打印当前所有IP

[root@youngfitn ~]# ip addr |grep 'inet ' |awk '{print $2}' |awk -F"/" '{print $1}' 127.0.0.1 
192.168.2.115

案例6:打印根分区已用空间的百分比(仅打印数字)

[root@youngfitn ~]# df -P |grep '/$' |awk '{print $5}' |awk -F"%" '{print $1}'
6

[root@youngfitn ~]# ip addr |grep 'inet ' |tee ip.txt |awk -F"/" '{print $1}' |awk '{print $2}'     //将前面内容tee输入重定向到ip.txt文件里面去
127.0.0.1
172.16.60.1 

[root@youngfitn ~]# cat ip.txt    
inet 127.0.0.1/8 scope host lo 
inet 172.16.60.1/24 brd 172.16.60.255 scope global eth0

[root@youngfitn ~]# ip addr |grep 'inet ' |tee -a ip.txt |awk -F"/" '{print $1}' |awk '{print $2}'     -a追加
127.0.0.1 
172.16.60.1

[root@youngfitn ~]# date >date.txt
[root@youngfitn ~]# date |tee date.txt
[root@youngfitn ~]# top -d 1 -bn 1 > top.txt
[root@youngfitn ~]# top -d 1 -bn 1 |tee top.txt

四.参数传递 Xargs

当文件存在不同目录,而又有共同特性时,能用上传参

awk sed grep sort uniq less more xargs xargs: ls cp rm

案例1

[root@localhost ~]# touch /home/file{1..5}

[root@localhost ~]# vim files.txt

/home/file1

/home/file2

/home/file3

/home/file4

/home/file5

[root@localhost ~]# cat files.txt |ls -l            //不加xargs传参,看输出结果

[root@localhost ~]# cat files.txt |rm -rvf          //不加xargs传参,看输出结果

cont.

[root@localhost ~]# cat files.txt |xargs ls -l          

-rw-r--r--. 1 root root 0 Mar 11 10:35 /home/file1

-rw-r--r--. 1 root root 0 Mar 11 10:35 /home/file2

-rw-r--r--. 1 root root 0 Mar 11 10:35 /home/file4

-rw-r--r--. 1 root root 0 Mar 11 10:35 /home/file5

[root@localhost ~]# cat files.txt |xargs rm -rvf    

removed ‘/home/file1’

removed ‘/home/file2’

removed ‘/home/file4’

removed ‘/home/file5’

案例2

[root@localhost ~]# touch /home/file{1..5}

[root@localhost ~]# cat files.txt |xargs -I {} ls -l {}

-rw-r--r--. 1 root root 0 Mar 11 10:40 /home/file1 

-rw-r--r--. 1 root root 0 Mar 11 10:40 /home/file2

-rw-r--r--. 1 root root 0 Mar 11 10:40 /home/file4

-rw-r--r--. 1 root root 0 Mar 11 10:40 /home/file5 

[root@localhost ~]# cat files.txt |xargs -I {} cp -rvf {} /tmp 
‘/home/file1’ -> ‘/tmp/file1’ 
‘/home/file2’ -> ‘/tmp/file2’ 
‘/home/file4’ -> ‘/tmp/file4’
‘/home/file5’ -> ‘/tmp/file5’ 

[root@localhost ~]# cat files.txt |xargs -I YOUNG cp -rvf YOUNG /var/tmp
‘/home/file1’ -> ‘/var/tmp/file1’ 
‘/home/file2’ -> ‘/var/tmp/file2’
‘/home/file4’ -> ‘/var/tmp/file4’
‘/home/file5’ -> ‘/var/tmp/file5’

案例3

 [root@localhost ~]# find /etc -iname "*ifcfg*" |xargs -I {} cp -rf {} /tmp

你可能感兴趣的:(linux管道及重定向)