管道

从命令行角度来看,管道是流通字节流。也就是说,管道能够接受前面一个命令的输出,并且把输出交给它后面的命令去处理。
要求是
1) 前面一个要有命令的输出,也就是屏幕要有正确的输出。
2) 后面一个命令,要能支持读取管道里面的字节。支持命令有
cat,head,more,less,head,tac,nl,
sort,wc,rev,uniq
mysql,bash

举例:

  1. 求出当前命令有多少文件和目录。
    ls -l |wc -l
  2. 求出/etc/下conf结尾文件有多少行
    cat /etc/*conf |wc -l
  3. 把/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
  1. 求出
    求出股票最高价的那天。

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; " 
作者:严锋  创建时间:2023-12-06 09:56
最后编辑:严锋  更新时间:2025-05-09 15:48