Linux管道和重定向
重定向
文件描述符
file descriptors (FD,文件描述符 或 Process I/O channels)
进程使用文件描述符来管理打开的文件
$$ 当前终端的pid
[root@localhost ~]# ls /proc/$$/fd
0 1 2 3 255
文件描述符 0 与 进程的标准输入(standard input)
文件描述符 1 与 标准输出(standard output)
文件描述符 2 与 标准错误(standard error)
e.g.
如何查看一个进程打开的文件描述符
[root@localhost ~]# ps aux | grep vim
root 1195 0.0 0.4 151204 4900 pts/1 S+ 22:39 0:00 vim a.txt
root 1214 0.0 0.0 112660 972 pts/0 S+ 22:47 0:00 grep --color=auto vim
[root@localhost ~]# ls -l /proc/1195/fd
total 0
lrwx------ 1 root root 64 Mar 5 22:48 0 -> /dev/pts/1
lrwx------ 1 root root 64 Mar 5 22:48 1 -> /dev/pts/1
lrwx------ 1 root root 64 Mar 5 22:43 2 -> /dev/pts/1
lrwx------ 1 root root 64 Mar 5 22:48 3 -> /root/.a.txt.swp
输出重定向 (覆盖,追加)
正确输出: 1> 1>> 等价于 > >>
错误输出: 2> 2>>
案例1:输出重定向(覆盖)
[root@localhost ~]# date 1> date.txt
案例2:输出重定向(追加)
[root@localhost ~]# date >> date.txt
案例3:错误输出重定向
[root@localhost ~]# ls /home/ /aaaaaaaaa >list.txt
ls: 无法访问/aaaaaaaaa: 没有那个文件或目录
[root@localhost ~]# ls /home/ /aaaaaaaaa >list.txt 2>error.txt //重定向到不同的位置
案例4: 正确和错误都输入到相同位置
[root@localhost ~]# ls /home/ /aaaaaaaaa &>list.txt //混合输出
案例5: 正确和错误都输入到相同位置
[root@localhost~]# ls /home/ /aaaaaaaaa >list.txt 2>&1 //重定向到相同的位置
案例6:重定向到空设备/dev/null
[root@localhost ~]# ls /home/ /aaaaaaaaa >list.txt 2>/dev/null //空设备,即将产生的输出丢掉
[root@localhost~]# ls /home/ /aaaaaaaaa &>/dev/null //空设备,即将产生的输出丢掉
案例7:脚本中使用重定向
[root@localhost ~]# 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@localhost ~]# vim ping1.sh
[root@localhost ~]# chmod +x ping1.sh
[root@localhost ~]# ./ping1.sh
添加执行权限的文件是可以使用./或者/去执行一个文件
不加执行权限可不可以执行文件(可以)但是,不能使用./或/ 要使用bash或者sh去执行这个文件
案例7:脚本中使用重定向
[root@localhost ~]# 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@localhost ~]# vim ping2.sh
ping -c1 10.18.40.100 &>/dev/null
if [ $? -eq 0 ];then
echo "10.18.40.100 可以访问." >>up.txt
else
echo "10.18.40.100 不可以访问" >>down.txt
fi
#!/bin/bash 解释器:解释这个脚本里面的内容
最终版脚本:
for i in {1..100}
do
ping -c1 10.11.65.$i &>/dev/null
if [ $? -eq 0 ];then
echo "10.11.65.$i is up" >>up.txt
else
echo "10.11.65.$i is down" >>down.txt
fi
done
标准输入:
< 0<
综合案例1:
[root@localhost ~]# grep 'root' < /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
mysql:
mysql -u root -p123 farm < qqfarm.sql
-u 用户名
-p 密码
farm 数据库中的一个库名
qqfarm.sql 数据库文件
将数据库文件qqfarm.sql导入到farm的库中.
综合案例2: 利用重定向建立多行的文件 脚本script创建多行文件
[root@localhost ~]# cat >>file200.txt <<EOF
111
222
333
yyy
ccc
EOF
管道
作用:
实现进程间通信的手段之一
好处:
Linux的程序小,功能单一,效率高,但是无法完成很复杂的任务,就需要借助于管道将多个进程组合起来
用法:
command1 | command2 |command3 |...
[root@localhost ~]# ps aux |grep 'sshd'
[root@localhost ~]# rpm -qa |grep bash
sort对字段排序
[root@localhost ~]# sort -rn b.txt
9
7
6
5
3
2
1
-n 按数值,默认按字符排序
-r 逆序
uniq去重
[root@localhost ~]# uniq -c b.txt //统计重复的次数
1 5
1 6
1 7
1 9
1 1
1 2
1 3
1
awk打印指定的字段
例2:统计当前/etc/passwd中用户使用的shell类型
思路:取出第七列(shell) | 排序(把相同归类)| 去重
[root@localhost ~]# awk -F: '{print $7}' /etc/passwd
[root@localhost ~]# awk -F: '{print $7}' /etc/passwd |sort
[root@localhost ~]# awk -F: '{print $7}' /etc/passwd |sort |uniq
[root@localhost ~]# awk -F: '{print $NF}' /etc/passwd |sort |uniq -c
-F: 指定字段分隔符,默认以空格或者是tab分隔
$7 第七个字段
$NF表示最后一个字段
$(NF-1)表示倒数第二个字段
NR
NR==2 第二行
NR==9 第九行
wc -l
计算文件里有多少行,返回的结果是数字
例如 cat /etc/passwd | wc -l
64
说明有64行,因为每个账户占一行,64行也就是代表有64个账户
三通定向tee
借助于三通管道可以实现将前一个进程的输出作为后一个进程的输入,也可以将前一个进程的输出结果重定向到一个文件中。
|tee file 覆盖
|tee -a file 追加
[root@xingdian ~]# ip a show eth0 |tee file1 |grep 'inet ' |tee file2 |awk -F"/" '{print $1}'
|tee file3 |awk '{print $2}' |tee file4
172.16.140.1
[root@xingdian ~]# cat file1
13: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN
link/ether 3c:97:0e:54:c3:57 brd ff:ff:ff:ff:ff:ff
inet 172.16.140.1/24 brd 172.16.140.255 scope global br0
inet6 fe80::3e97:eff:fe54:c357/64 scope link
valid_lft forever preferred_lft forever
[root@xingdian ~]# cat file2
inet 172.16.140.1/24 brd 172.16.140.255 scope global br0
[root@xingdian ~]# cat file3
inet 172.16.140.1
[root@xingdian ~]# cat file4
到这里,管道和重定向就讲完了,如果有疑问或者有建议,欢迎评论去留言,一起拯救世界
Linux进程管理--最全最详细的Linux进程基本操作,进程查看,进程筛选,进程kill,网络进程的基本操作ps aux ,ss,netstat等等_error1024的博客-CSDN博客