一 .管道及重定向
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 </dev/zero >/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 <bbs.sql
[root@youngfitn ~]# mysql
MariaDB [(none)]> show databases;
MariaDB [(none)]> \q
c 案例5:at
[root@youngfitn ~]# at now +5 min /延时5分钟的命令
at> useradd yang99 //延时5分钟创建yang99这个账户
at> <EOT>
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 <a.txt job
2 at Mon Jul 31 15:27:00 2017
综合案例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 <<EOF 输出项到file4 并以EOF为结尾,EOF仅为结束的标识
111
222
333
EOF
[root@youngfitn ~]# cat file4
111
222
333
综合案例2: 利用重定向建立多行
的文件
[root@youngfitn ~]# vim create_file.sh
cat >file200.txt <<EOF //将内容放入这个文件中去
111
222
333
yyy
ccc
EOF
[root@youngfitn ~]# bash create_file.sh //脚本运行程序
[root@youngfitn ~]# cat file200.txt
111
222
333
yyy
ccc
综合案例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