一 .管道及重定向
I/O重定向
I/O Redirection
标准输入、标准输出、标准错误
输出重定向及综合案例
输入重定向及结合案例
标准输入、标准输出、标准错误
file descriptors (FD,文件描述符 或 Process I/O channels): 进程使用文件描述符来管理打开的文件
[root@newrain ~]# 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>>
1.1. 案例1:输出重定向(覆盖)
[root@newrain ~]# date 1> date.txt
1.2.案例2:输出重定向(追加)
root@newrain ~]# date >> date.txt
1.3. 案例3:错误输出重定向
[root@newrain ~]# ls /home/ /aaaaaaaaa >list.txt
ls: 无法访问/aaaaaaaaa: 没有那个文件或目录
[root@newrain ~]# ls /home/ /aaaaaaaaa >list.txt 2>error.txt
//重定向到不同的位置
1.4.正确和错误都输入到相同位置
[root@newrain ~]# ls /home/ /aaaaaaaaa &>list.txt //混合输出
1.5. 正确和错误都输入到相同位置
[root@newrain ~]# ls /home/ /aaaaaaaaa >list.txt 2>&1 //重定向到相同的位置
1.6. 正确和错误都输入到相同位置
[root@newrain ~]# ls /home/ /aaaaaaaaa >list.txt 2>&1 //重定向到相同的位置
思考题:
cp /etc/passwd /dev/null ???
cp /etc/passwd /etc/passwd1 2>/dev/null ???
如果/dev/null设备被删除 rm -f /dev/null
1 手动创建 mknod -m 666 /dev/null c 1 3
2 重启自动创建
主设备号 从设备号 MAJOR MINOR 主设备号相同: 表示为同一种设备类型,也可以认为kernel使用的是相同的驱动 从设备号:在同一类型设备中的一个序号
普通文件和设备文件:
[root@newrain ~]# ll /dev/null /dev/sda1 /etc/hosts
crw-rw-rw- 1 root root 1, 3 8月 1 06:36 /dev/null
brw-rw---- 1 root disk 8, 1 8月 1 06:36 /dev/sda1
-rw-r--r--. 1 root root 158 6月 7 2013 /etc/host
1.7.脚本中使用重定向
[root@newrain ~]# 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@newrain ~]# chmod +x ping1.sh
[root@newrain ~]# ./ping1.sh
1.8.脚本中使用重定向
[root@newrain ~]# vim ping1.sh
ping -c1 10.18.40.100 &>/dev/null
if [ $? -eq 0 ];then
echo "10.18.40.100 is up."
else
echo "10.18.40.100 is down!"
fi
案例8:脚本中使用重定向
[root@newrain ~]# 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@newrain ~]# vim ping2.sh
[root@newrain ~]# chmod +x ping1.sh
[root@newrain ~]# ./ping2.sh
二.输入重定向
标准输入: < 等价 0<
a.案例1:
[root@newrain ~]# mail alice //没有改变输入的方向,默认键盘
Subject: hello
1111
2222
3333
.
EOT
[root@newrain ~]# su - alice
[alice@newrain ~]$ 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@newrain ~]# mail -s "test01" alice < /etc/hosts //输入重定向,来自于文件
b.案例2:
[root@newrain ~]# grep 'root' //没有改变输入的方向,默认键盘,此时等待输入...
yang sss sssrootssss..
sssrootssss..
[root@newrain ~]# grep 'root' < /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
案例3
[root@newrain ~]# dd if=/dev/zero of=/file1.txt bs=1M count=2
[root@newrain ~]# dd </dev/zero >/file2.txt bs=1M count=20
案例4:mysql表结构导入
[root@newrain ~]# yum -y install mariadb-server mariadb
[root@newrain ~]# systemctl start mariadb
[root@newrain ~]# vim bbs.sql
create database bbs;
create table bbs.t1 (id int);
insert into bbs.t1 values(1);
[root@newrain ~]# mysql <bbs.sql
[root@newrain ~]# mysql
MariaDB [(none)]> show databases;
MariaDB [(none)]> \q
c 案例5:at
[root@newrain ~]# at now +5 min
at> useradd yang99
at> <EOT>
job 1 at Mon Jul 31 15:29:00 2017
[root@newrain ~]# vim at.txt useradd yang100 useradd yang102
[root@newrain ~]# at now +2 min <a.txt job 2 at Mon Jul 31 15:27:00 2017
综合案例1: 利用重定向建立多行的文件
[root@newrain ~]# echo "111" > file1.txt
[root@newrain ~]# cat file1.txt 111
[root@newrain ~]# cat >file2.txt
111
222
333
444
^D
[root@newrain ~]# cat file2.txt
请问:file2.txt有几行?
[root@newrain ~]# cat >>file3.txt
aaa
bbb
ccc
ddd
^D
[root@newrain ~]# cat file3.txt
请问:file3.txt有几行?
[root@newrain ~]# cat >file4 <<EOF
111
222
333
EOF
[root@newrain ~]# cat file4
111
222
333
综合案例2: 利用重定向建立多行
的文件
[root@newrain ~]# vim create_file.sh
cat >file200.txt <<EOF
111
222
333
yyy
ccc
EOF
[root@newrain ~]# bash create_file.sh
[root@newrain ~]# cat file200.txt
111
222
333
yyy
ccc
综合案例3: 脚本中利用重定向打印消息
[root@newrain ~]# cat create_file.sh
cat <<-EOF
111
222
333
yyy
ccc
EOF
[root@newrain ~]# bash create_file.sh
111
222
333
yyy
ccc
[root@newrain ~]# vim yang.sh
cat <<-EOF
+------------------------------------------------+ | | | 虚拟机基本管理 v4.0
by tianyun
```
1. 安装KVM
2. 安装或重置CentOS-6.8
3. 安装或重置CentOS-7.3
4. 安装或重置RHEL-6.4
5. 安装或重置Windows-7
6. 删除所有虚拟机
7. q. 退出管理程序
```
+------------------------------------------------+ |
EOF
综合案例4
[root@newrain ~]# ls; date &>/dev/null //希望两条命令输出都重定向 ??
[root@newrain ~]# ls &>/dev/null; date &>/dev/null
[root@newrain ~]# (while :; do date; sleep 2; done) & //在后台运行,但输出依然在前台终端
[root@newrain ~]# 2017年 08月 01日 星期二 10:12:42 CST
2017年 08月 01日 星期二 10:12:44 CST
2017年 08月 01日 星期二 10:12:46 CST
2017年 08月 01日 星期二 10:12:48 CST
2017年 08月 01日 星期二 10:12:50 CST
[root@newrain ~]# (while :; do date; sleep 2; done) &>date.txt &
[root@newrain ~]# tailf /date.txt
2017年 08月 01日 星期二 10:15:29 CST
2017年 08月 01日 星期二 10:15:31 CST
2017年 08月 01日 星期二 10:15:33 CST
2017年 08月 01日 星期二 10:15:35 CST
2017年 08月 01日 星期二 10:15:37 CST
2017年 08月 01日 星期二 10:15:39 CST
2017年 08月 01日 星期二 10:15:41 CST
[root@newrain ~]# jobs
[1]+ 运行中 ( while :; do
date; sleep 2;
done ) &>/date.txt &
[root@newrain ~]# kill %1
[root@newrain ~]# jobs
后面课程学习安装源码软件时:
[root@newrain ~]# (./configure && make && make install) &>/dev/null
三. 进程管道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@newrain ~]# ll /dev/ |less
[root@newrain ~]# ps aux |grep 'sshd'
[root@newrain ~]# rpm -qa |grep 'httpd' //查询所有安装的软件包,过滤包含httpd的包
[root@newrain ~]# yum list |grep 'httpd'
案例1:将/etc/passwd中的用户按UID大小排序
[root@newrain ~]# sort -t":" -k3 -n /etc/passwd //以: 分隔,将第三列按字数升序
[root@newrain ~]# sort -t":" -k3 -n /etc/passwd -r //逆序 [root@newrain ~]# sort -t":" -k3 -n /etc/passwd |head -t 指定字段分隔符--field-separator -k 指定列 -n 按数值
案例2:统计出最占CPU的5个进程
[root@newrain ~]# ps aux --sort=-%cpu |head -6
案例3:统计当前/etc/passwd中用户使用的shell类型
思路:取出第七列(shell) | 排序(把相同归类)| 去重
[root@newrain ~]# awk -F: '{print $7}' /etc/passwd
[root@newrain ~]# awk -F: '{print $7}' /etc/passwd |sort
[root@newrain ~]# awk -F: '{print $7}' /etc/passwd |sort |uniq
[root@newrain ~]# 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: 统计网站的访问情况 top 20 思路: 打印所有访问的连接 | 过滤访问网站的连接 | 打印用户的IP | 排序 | 去重
[root@newrain ~]# yum -y install httpd
[root@newrain ~]# systemctl start httpd
[root@newrain ~]# systemctl stop firewalld
[root@newrain ~]# ss -an |grep :80 |awk -F":" '{print $8}' |sort |uniq -c
netstat -an | grep ^tcp | awk '{print $NF}' |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@newrain ~]# ss -an |grep :80 |awk -F":" '{print $8}' |sort |uniq -c |sort -k1 -rn |head -n 20
案例5: 打印当前所有IP
[root@newrain ~]# ip addr |grep 'inet ' |awk '{print $2}' |awk -F"/" '{print $1}' 127.0.0.1 192.168.2.115
案例6:打印根分区已用空间的百分比(仅打印数字)
[root@newrain ~]# df -P |grep '/$' |awk '{print $5}' |awk -F"%" '{print $1}'
[root@newrain ~]# ip addr |grep 'inet ' |tee ip.txt |awk -F"/" '{print $1}' |awk '{print $2}'
127.0.0.1
172.16.60.1
[root@newrain ~]# 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@newrain ~]# ip addr |grep 'inet ' |tee -a ip.txt |awk -F"/" '{print $1}' |awk '{print $2}'
127.0.0.1
172.16.60.1
[root@newrain ~]# date >date.txt
[root@newrain ~]# date |tee date.txt
[root@newrain ~]# top -d 1 -b -n 1 > top.txt
[root@newrain ~]# top -d 1 -b -n 1 |tee top.txt
作业
- 了解匿名管道和命名管道的区别?
- 如何创建命名管道?
四.参数传递 Xargs
awk sed grep sort uniq less more xargs xargs: ls cp rm
案例1
[root@newrain ~]# touch /home/file{1..5}
[root@newrain ~]# vim files.txt
/home/file1
/home/file2
/home/file3
/home/file4
/home/file5
[root@newrain ~]# cat files.txt |ls -l
[root@newrain ~]# cat files.txt |rm -rvf
[root@newrain ~]# 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/file3
-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@newrain ~]# cat files.txt |xargs rm -rvf
removed ‘/home/file1’
removed ‘/home/file2’
removed ‘/home/file3‘
removed ‘/home/file4’
removed ‘/home/file5’
案例2
[root@newrain ~]# touch /home/file{1..5}
[root@newrain ~]# 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/file3
-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@newrain ~]# cat files.txt |xargs -I {} cp -rvf {} /tmp
‘/home/file1’ -> ‘/tmp/file1’
‘/home/file2’ -> ‘/tmp/file2’
‘/home/file3’ -> ‘/tmp/file3’
‘/home/file4’ -> ‘/tmp/file4’
‘/home/file5’ -> ‘/tmp/file5’
[root@newrain ~]# cat files.txt |xargs -I YANG cp -rvf YANG /var/tmp
‘/home/file1’ -> ‘/var/tmp/file1’
‘/home/file2’ -> ‘/var/tmp/file2’
‘/home/file3’ -> ‘/var/tmp/file3’
‘/home/file4’ -> ‘/var/tmp/file4’
‘/home/file5’ -> ‘/var/tmp/file5’
案例3
[root@newrain ~]# find /etc -iname "*ifcfg*" |xargs -I {} cp -rf {} /tmp
find /etc/ -iname "*ifcfg" -exec cp {} /tmp \;