管道
从命令行角度来看,管道是流通字节流。也就是说,管道能够接受前面一个命令的输出,并且把输出交给它后面的命令去处理。
要求是
1) 前面一个要有命令的输出,也就是屏幕要有正确的输出。
2) 后面一个命令,要能支持读取管道里面的字节。支持命令有
cat,head,more,less,head,tac,nl,
sort,wc,rev,uniq
mysql,bash
举例:
- 求出当前命令有多少文件和目录。
ls -l |wc -l
- 求出/etc/下conf结尾文件有多少行
cat /etc/*conf |wc -l
- 把/etc/下以conf文件按照大小倒排序
[xiehaibing@localhost ~]$ ls -ld /etc/*conf | sort -k5 -nr
-rw-r--r--. 1 root root 7274 Dec 27 2022 /etc/kdump.conf
-rw-r--r--. 1 root root 5171 Oct 31 2018 /etc/man_db.conf
-rw-r--r--. 1 root root 3232 Oct 13 2020 /etc/rsyslog.conf
-rw-r--r--. 1 root root 449 Oct 13 2020 /etc/sysctl.conf
-rw-r--r--. 1 root root 216 Apr 1 2020 /etc/sestatus.conf
-rw-r-----. 1 root root 191 Mar 2 2019 /etc/libaudit.conf
-rw-r--r--. 1 root root 112 Sep 30 2020 /etc/e2fsck.conf
-rw-r--r--. 1 root root 77 Dec 5 09:07 /etc/resolv.conf
-rw-r--r--. 1 root root 55 Aug 8 2019 /etc/asound.conf
-rw-r--r--. 1 root root 37 Dec 27 2022 /etc/vconsole.conf
-rw-r--r--. 1 root root 28 Feb 28 2013 /etc/ld.so.conf
-rw-r--r--. 1 root root 19 Dec 27 2022 /etc/locale.conf
-rw-r--r--. 1 root root 9 Jun 7 2013 /etc/host.conf
- 求出
求出股票最高价的那天。
cat 000002.csv | sort -k3 -nr |head -1
xargs
作为管道桥梁,如果有不支持管道,可以使用该命令进行嫁接
ls *conf | xargs rm -f
find /etc/ -type f -name *conf | xargs rm -f
求出etc目录所有conf文件总行数find /etc/*conf -type f 2>/dev/null | xargs cat |wc -l
取得/etc/目录下conf文件总数find /etc/*conf -type f 2>/dev/null | cat |wc -l
如果xargs 后面的命令要带几个参数,需要使用-i 默认使用 {} 代替前面的结果
ls -1 /etc/*conf | xargs -i cat '{}' | wc -l
这样就可以得到所有的文本的函数
重定向
正确的输出用1来表示
错误的输出用2来表示
屏幕本身是一个文件
输出重定向
首先准备重定向文件,然后再执行步骤。
一个大于号
首先清空文件,然后执行命令。如果文件不存在,那么创建文件
cat /etc/asround.conf >b.conf
不能这么写
head a.txt >a.txt
这样话会导致a.txt首先被清空
二个大于号
追加文件,如果文件不存,首先创建文件cat /etc/services >>a.txt
重定向分为
1,表示正确输出,可以默认不写
2,表示错误输出,2必须写。
举例
cat pan.log |sort -nr -k5 >sorted.pan.log
netstat -antp | sort -k5 |head 10 > top.conn
ps -ef |sort -k6 -nr |head -10 >> topmem10.txt
合并多个命令的输出流。
-bash-4.2$ cat /etc/* 2>error |wc -l
14184
-bash-4.2$ cat /etc/* 2>error |wc -l 2>error
14184
-bash-4.2$ (cat /etc/* 2>error |wc -l ) 2>error
14184
合并正确和错误输出流
/dev/null是系统的null设备,用于只有2字节
find /etc 2>dev/null >&2
cat /etc/*conf >all.txt 2>&1
rm -r * 2>/dev/null >&2
注意点
- 不可以读入文件a,又重新定向到a
- 如果是为了避免输出错误信息,或者只想看到错误信息,此时,可以2或者1 单独重定向。
- 如果是应用程序再执行过程中收集日志数据,那么必须合并输出流,并定向到同一个文件
- curl 类似网络网络命令,保持文件时候,可以使用输出重定向
- 文本处理命令,比如head,tail,cat之类的,如果要覆盖原文件,需要通过中转处理,
head -100 a.txt >a.txt.tmp ; mv a.txt.tmp a.txt
输入重定向
输入重定向很复杂,非常常用,主要用于
1) 自动化话处理
2) 定时处理需要输入的时候
输入重定向必须要 改命令支持输入重定向
支持输入重定向的命令有(和支持基本一致)
- head,tail,cat,tee, more,less,sort,wc,uniq,tr,rev,paste,mirror
- sed ,grep ,awk
- 数据库相关的 mysql,sqlplus,db2
但是文件操作命令都不支持管道和输入重定向 - rm ,mv,cp,touch ,find
- chmod,chown,chgrp,ip
单个文件输入重定向 (<)
如果一个命令需要进行和键盘交互,那么就可以使用输入重定向,一般把需要输入文本写入到一个文件当中去,然后通过输入重定向自动化完成
例子:
某个文件user.sql 内容
create database abc utf8;
create user abc@'%' identified by '123456';
grant all privileges on abc.* to abc@'%'
那么如果mysql执行可以使用mysql -uroot -proot -h192.168.10.3 -P 33062 < user.sql
answers文件里面有4个回车
ssh-keygen <answers
直接输入 (<<)
<< 直接把输入的文字交给命令
cat <<EOF >a.txt
testing.
EOF
cat a.txt
testing.
# 复杂一点
mysql <<EOF
select * from qa;
truncate table qa;
EOF
tee <<EOF a.txt
a
b
c
d
EOF
<<< 重定向
直接后面的字符串直接作为键盘缓冲区。
cat <<<"testing" >a.txt
cat a.txt
testing
#复杂一点
mysql <<<"select * from qa; "
mysql -e "select * from qa; "
最后编辑:严锋 更新时间:2025-05-09 15:48