2023.6.2 Linux重定向与管道

Posted BXXY5961

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2023.6.2 Linux重定向与管道相关的知识,希望对你有一定的参考价值。

02.Linux重定向与管道
1.1标准输⼊与输出
1.2输出重定向
1.3输⼊重定向
1.4进程管道技术
1.4.1tee管道技术
1.4.2参数传递xargs
Author vx: WingspanGo
为何要使⽤重定向
1.当屏幕输出的信息很重要,⽽且希望保存重要的信息时;
2.后台执⾏中的程序,不希望他⼲扰屏幕正常的输出结果时;
3.系统的例⾏命令, 例如定时任务的执⾏结果,希望他可以存下来时;
4.⼀些执⾏命令,我们已经知道他可能出现错误信息, 想将他直接丢弃时;
5.错误⽇志与标准正确⽇志需要分别输出⾄不同的⽂件;
1.1标准输⼊与输出
执⾏⼀个 shell 程序时通常会⾃动打开三个标准⽂件
标准输⼊(STDIN,⽂件描述符为0):通常对应终端的键盘,也可从其他⽂件或命令或者⽂件内容中输⼊。
标准输出(STDOUT,⽂件描述符为1):默认输出到屏幕。
错误输出(STDERR,⽂件描述符为2):默认输出到屏幕。
⽂件名称(filename,⽂件描述符为3+)
进程将从标准输⼊中得到数据,将正常输出打印⾄屏幕终端,将错误的输出信息也打印⾄屏幕终端。
进程使⽤⽂件描述符 (file descriptors) 来管理打开的⽂件

 

 

以 cat 命令为例, cat 命令的功能是从命令⾏给出的⽂件中读取数据,并将这些数据直接送到标准输出。若使⽤如
下命令:
[root@wing ~]# cat /etc/passwd

将会把⽂件 /etc/passwd 的内容依次显示到屏幕上。但如果 cat 命令⾏中没有参数, 它就会从标准输⼊中读取数
据, 并将其送到标准输出。
输⼊输出过程检测
1.2输出重定向
重定向: 改变标准输⼊、标准输出的⽅向的就是重定向
标准覆盖输出重定向 >
标准追加输出重定向 >>
错误覆盖输出重定向 2>
错误追加输出重定向 2>>
输⼊重定向 <
[root@wing ~]# cat
hello
hello
^C
//⽤户输⼊的每⼀⾏都⽴刻被cat命令输出到屏幕上。
//持续追踪查看⽂件内容
[root@wing ~]# tail -f /root/command/std/test.log
ctrl+z 将进程转到后台
ctrl+z 将进程转到后台
//查看运⾏的进程
[root@wing ~]# ps
PID TTY     TIME CMD
5848 pts/1  00:00:00 bash
6885 pts/1  00:00:00 tail
6888 pts/1  00:00:00 ps
//查看6885进程下的⽂件描述符
[root@wing ~]# ls -l /proc/6885/fd
total 0
lrwx------ 1 root root 64 Dec 3 06:57 0 -> /dev/pts/1
lrwx------ 1 root root 64 Dec 3 06:57 1 -> /dev/pts/1
lrwx------ 1 root root 64 Dec 3 06:56 2 -> /dev/pts/1
lr-x------ 1 root root 64 Dec 3 06:57 3 -> /etc/passwd
lr-x------ 1 root root 64 Dec 3 06:57 4 -> inotify
//Linux查看标准输⼊输出设备
[root@wing ~]# ls -l /dev/std*
lrwxrwxrwx 1 root root 15 Dec 2 22:30 /dev/stderr -> /proc/self/fd/2
lrwxrwxrwx 1 root root 15 Dec 2 22:30 /dev/stdin -> /proc/self/fd/0
lrwxrwxrwx 1 root root 15 Dec 2 22:30 /dev/stdout -> /proc/self/fd/1

1.2输出重定向
重定向: 改变标准输⼊、标准输出的⽅向的就是重定向
标准覆盖输出重定向 >
标准追加输出重定向 >>
错误覆盖输出重定向 2>
错误追加输出重定向 2>>
输⼊重定向 <

类型 操作符 ⽤途
标准覆盖输出重定向 > 将命令的执⾏结果输出到指定的⽂件中, ⽽不是直接显示在屏幕上
标准追加输出重定向 >> 将命令执⾏的结果追加输出到指定⽂件
标准输⼊重定向 << 将命令中接收输⼊的途径由默认的键盘更改为指定的⽂件

案例1: 标准输出重定向(覆盖)

 

//标准输出重定向, 先清空,后写⼊, 如果⽂件不存在则创建
[root@wing ~]# ifconfig ens33 > abc

案例2: 标准输出重定向(追加)

 

//标准追加输出重定向, 向配置⽂件末尾追加内容
[wing@wing ~]$ echo "This is network conf" >> if

案例3: 错误输出重定向

 

//正确输出以及错误输出重定向⾄⼀个⽂件
[root@wing ~]# useradd test
[root@wing ~]# su - test
//将标准输出和标准错误输出重定向到不同⽂件
[wing@wing ~]$ find /etc -name "*.conf" 1>a 2>b

 

案例4: 正确和错误都输⼊到相同位置

 

//将标准输出和标准错误输出重定向到同⼀个⽂件, 混合输出
[wing@wing ~]$ find /etc -name "*.conf" &>ab
//合并两个⽂件内容⾄⼀个⽂件
[wing@wing ~]$ cat a b > c

案例5: 正确和错误都输⼊到相同位置

 

//重定向到相同的位置
[root@wing ~]# ls /root /error >ab 2>&1

案例6: 重定向到空设备/dev/null

 

 

//空设备,即将产⽣的输出丢掉
[root@wing ~]# ls /root /error >ab 2>/dev/null
[root@wing ~]# ls /root /error >ab &>/dev/null
//思考
[root@wing ~]# cp /etc/passwd /dev/null
[root@wing ~]# cp /etc/passwd /etc/passwd1 2>/dev/null
如果/dev/null 设备被删除
[root@wing ~]# rm -f /dev/null
//1.⼿动创建
[root@wing ~]# mknod -m 666 /dev/null c 1 3
//2.重启⾃动创建
MAJOR主设备号 MINOR从设备号
主设备号相同: 表示为同⼀种设备类型,也可以认为 kernel 使⽤的是相同的驱动
从设备号:在同⼀类型设备中的⼀个序号

 

案例7: 脚本中使⽤重定向

[root@wing ~]# vim ping.sh
ping -c1 192.168.9.3
if [ $? -eq 0 ];then
 echo "192.168.9.3 is up."
else
 echo "192.168.9.3 is down."
fi
[root@wing ~]# chmod +x ping.sh
[root@wing ~]# ./ping.sh
//改进后版
[root@wing ~]# vim ping.sh
ping -c1 192.168.9.3 &>/dev/null
if [ $? -eq 0 ];then

echo "192.168.9.3 is up."
else
 echo "192.168.9.3 is down."
fi

 

案例8: 脚本中使⽤重定向

 

[root@wing ~]# vim ping2.sh
ping -c1 192.168.9.3 &>/dev/null
if [ $? -eq 0 ];then
 echo "192.168.9.3 is up." >>up.txt
else
 echo "192.168.9.3 is down." >>down.txt
fi
[root@wing ~]# chmod +x ping2.sh
[root@wing ~]# ./ping2.sh

1.3输⼊重定向

标准输⼊: < 等价 0<

案例1

[root@wing std]# sort < 1.txt
1
10
2
3
4
5
6
7
8
9
[root@wing std]# sort -rn < 1.txt
10
9
8
7
6
5
4
3
2
1

案例2

////没有改变输⼊的⽅向,默认键盘,此时等待输⼊
[root@wing ~]# grep \'root\'
xxx
xxx
[root@wing ~]# grep \'root\' < /etc/passwd
root:x:0:0:root:/root:/bin/bash

案例3

[root@wing ~]# dd if=/dev/zero of=/file1.txt bs=1M count=20
[root@wing ~]# dd </dev/zero >/file2.txt bs=1M count=20
fio 磁盘读写性能测试

案例4

//mysql 表结构导⼊
[root@wing ~]# mysql -uroot -p123 < bbs.sql

案例5: 利⽤重定向建⽴多⾏的⽂件

//⼿动执⾏ shell 命令
[root@wing ~]# echo "111" > file1.txt
[root@wing ~]# cat file1.txt
111
[root@wing ~]# cat >file2.txt
111
222
333
^D
[root@wing ~]# cat >>file3.txt
aaa
bbb
ccc
^D

 

案例6: 利⽤重定向建⽴多⾏的⽂件

//脚本 script 创建多⾏⽂件
[root@wing ~]# vim create_file.sh
cat >file200.txt <<EOF
111
222
333
yyy

ccc
EOF
[root@wing ~]# vim vm.sh
cat <<-EOF
+------------------- --- ---- --- ---- --- --- ---- --- --+ ||
| ====================== |
| 虚拟机基本管理 v5.0 |
| by wing |
| ====================== |
| 1. 安装 KVM |
| 2. 安装或重置 CentOS-6.9 |
| 3. 安装或重置 CentOS-7.4 |
| 5. 安装或重置 Windows-7 |
| 6. 删除所有虚拟机 |
| q. 退出管理程序 |
+------------------- --- ---- --- ---- --- --- ---- --- --+
EOF

案例7: 两条命令同时重定向

[root@wing ~]# ls; date &>/dev/null
[root@wing ~]# ls &>/dev/null; date &>/dev/null
[root@wing ~]# (ls; date) &>/dev/null

扩展点: subshell

[root@wing ~]# cd /boot; ls
//subshell 中执⾏
[root@wing ~]# (cd /boot; ls)
//如果不希望某些命令的执⾏对当前 shell 环境产⽣影响,请在subshell中执⾏

1.4进程管道技术

管道操作符号 "|" 连接左右两个命令, 将左侧的命令的标准输出, 交给右侧命令的标准输⼊

 

 下⾯的命令将 ls 命令的输出传递给 grep 命令来搜索包含 txt 的⽂件名:

ls | grep txt

管道操作符可以连接任意数量的命令,例如:

command1 | command2 | command3 | ... | commandN

格式: cmd1 | cmd2 [...|cmdn]

案例1: 将/etc/passwd 中的⽤户按 UID ⼤⼩排序

[root@wing ~]# sort -t":" -k3 -n /etc/passwd
[root@wing ~]# sort -t":" -k3 -n /etc/passwd -r
[root@wing ~]# sort -t":" -k3 -n /etc/passwd |head
sort -t":" -k3 -n /etc/passwd | head -n 10 | tail -n 1

案例2: 统计当前/etc/passwd 中⽤户使⽤的 shell 类型

//思路:取出第七列(shell) | 排序(把相同归类)| 去重
[root@wing ~]# awk -F: \'print $7\' /etc/passwd
[root@wing ~]# awk -F: \'print $7\' /etc/passwd |sort
[root@wing ~]# awk -F: \'print $7\' /etc/passwd |sort |uniq
[root@wing ~]# awk -F: \'print $7\' /etc/passwd |sort |uniq -c

案例3: 统计出最占CPU的5个进程

[root@wing ~]# ps aux --sort=-%cpu |head -6

进程资源 cpu mem
pid
user

time

案例4: 统计⽹站的访问情况 top 20

//思路: 打印所有访问的连接 | 过滤访问⽹站的连接 | 打印⽤户的 IP | 排序 | 去重
www.xxx.com/v1/api/add 假如说这个接⼝访问量⼤,⾃⼰模拟 找出来访问⽹站⽐较⾼的请求api
[root@wing ~]# yum -y install nginx
[root@wing ~]# systemctl start nginx
[root@wing ~]# systemctl stop firewalld
[root@wing ~]# netstat -antup |egrep :80 |egrep ESTAB |sort |uniq -c
[root@wing ~]# netstat -antup |egrep :80 |egrep ESTAB |sort |uniq -c |sort -k1 -rn
|head -n 20

 

案例5: 打印当前所有 IP

[root@wing ~]# ip addr |grep \'inet \' |awk \'print $2\' |awk -F"/" \'print $1\'
127.0.0.1
192.168.69.112

案例6: 打印根分区已⽤空间的百分⽐(仅打印数字)

[root@wing ~]# df |grep \'/$\' |awk \'print $5\' |awk -F"%" \'print $1\'

1.4.1tee管道技术

 

[root@wing ~]# ip addr |grep \'inet \' |tee ip.txt |awk -F"/" \'print $1\' |awk \'print
$2\'
127.0.0.1
192.168.69.112
192.168.122.1
[root@wing command]# cat ip.txt
 inet 127.0.0.1/8 scope host lo
 inet 192.168.9.3/24 brd 192.168.9.255 scope global noprefixroute ens33

重定向与 tee 区别

[root@wing ~]# date > date.txt
[root@wing ~]# date |tee date.txt

1.4.2参数传递xargs

将参数列表转换成⼩块分段传递给其他命令
读⼊ stdin 的数据转换为参数添加⾄命令后⾯
让⼀些不⽀持管道的命令可以使⽤管道。

管道命令符能让⼤家能进⼀步掌握命令之间的搭配使⽤⽅法,进⼀步提⾼命令输出值的处理效率。

[root@wing ~]# grep "/sbin/nologin" /etc/passwd | wc -l
33
[root@wing ~]# head -5 /etc/passwd|tail -1
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
//使⽤grep过滤输出信息
[root@wing ~]# ls -l /etc |grep pass
-rw-r--r--  1 root root  4653 Dec 2 15:54 passwd
-rw-r--r--. 1 root root  4606 Dec 2 15:54 passwd-
-rw-r--r--. 1 root root  1454 Sep 23 2014 passwd.OLD
//管道和标准输出以及标准错误输出, 使⽤普通⽤户执⾏如下命令
find /etc/ -name "p*"|grep passwd
find /etc/ -name "p*"|grep passwd > a
find /etc/ -name "p*"|grep passwd > b
find /etc/ -name "p*"|grep passwd &> ab

注意事项:
1.在管道后⾯的命令,都不应该在写⽂件名
2.在管道中只有标准输出才可以传递下⼀个命令, 标准错误输出会直接输出终端显示, 建议在使⽤管道前将标
准错误输出重定向。
例如: find /etc -name "*.conf" 2>/dev/null | grep rc
3.有些命令不⽀持管道技术, 但是可以通过 xargs 来实现管道传递。

例如: which cat|xargs ls -l
例如: ls |xargs rm -rvf
例如: ls |xargs cp -rvft /tmp/ -> ls | xargs -I cp -rvf /tmp
例如: ls |xargs mv -t /tmp/ -> ls | xargs -I mv /tmp

 

Linux管道符重定向与环境变量

——《Linux就该这么学》笔记

输入输出重定向
输入重定向
  指把文件导入到命令中
输出重定向
  指把原本要输出到屏幕的数据信息写入到指定文件中

输出重定向
  分为标准输出重定向和错误输出重定向
  每种有清空写入与追加写入两种模式

标准输入重定向(STDIN,文件描述符为0):默认从键盘输入,也可以从其他文件或命令中输入
标准输出重定向(STDOUT,文件描述符为1):默认输出到屏幕
错误输出重定向(STDERR,文件描述符为2):默认输出到屏幕

输入重定向符号及作用
  命令 < 文件: 将文件作为命令的标准输入
  命令 << 分界符: 从标准输入中读入,直到遇见分界符才停止
  命令 < 文件1 > 文件2: 将文件1作为命令的标准输入并将标准输出到文件2

输出重定向符号及作用
  命令 > 文件: 将标准输出重定向到一个文件中(清空原有文件的数据)
  命令 2> 文件: 将错误输出重定向到一个文件中(清空原有文件的数据)
  命令 >> 文件: 将标准输出重定向到一个文件中(追加到原有内容的后面)
  命令 2>> 文件: 将错误输出重定向到一个文件中(追加到原有内容的后面)
  命令 >> 文件 2>&1 或者 命令 &>> 文件: 将标准输出与错误输出共同写入到文件中(追加到原有内容的后面)

管道命令符
  格式: 命令1|命令2|......|命令n
  作用: 把左边命令的结果作为右边命令的输入
  eg: ls -l /etc/ | more

命令行通配符
  通配符就是通用的匹配信息的符号
  星号(*): 代表匹配零个或者多个字符
  问号(?): 代表匹配单个字符

常用的转义字符
  反斜杠(\): 使反斜杠后面的一个变量变为单纯的字符产
  单引号(‘‘): 转义其中所有的变量为单纯的字符串
  双引号(""): 保留其中的变量属性,不进行转义处理
  反引号(``): 把其中的命令执行后返回结果

重要的环境变量
  变量是计算机系统用于保存可变值的数据类型
Linux中10个环境变量
  HOME: 用户的主目录(即家目录)
  SHELL: 用户在使用的shell解释器名称
  HISTSIZE: 输出的历史命令记录条数
  HISTFILESIZE: 保存的历史命令记录条数
  MAIL: 邮件保存路径
  LANG: 系统语言、语系名称
  RANDOM: 生成一个随即数字
  PS1:Bash解释器的提示符
  PATH: 定义解释器搜索用户执行命令的路径
  EDITOR: 用户默认的文本编辑器

变量是由固定的变量名与用户或系统设置的变量值两部分组成的
  可以使用export命令将自己定义的变量提升为全局变量

env命令: 该命令可以查看Linux系统中所有的环境变量

命令在Linux中的执行步骤
  第一步:判断用户是否以绝对路径或相对路径的方式输入命令(如/bin/ls),如果时则直接执行
  第二步: Linux系统检查用户输入的命令是否为"别名命令"
  第三步: Bash解释器判断用户输入的是内部命令还是外部命令
  第四步: 系统在多个路径中查找用户输入的命令文件

  定义命令别名命令格式: alias 别名=命令
  删除命令别名命令格式: unalias 别名
  判断命令属于内部命令还是外部命令: type 命令名称
  第四步中定义路径的变量叫作PATH,每个路径值之间用冒号间隔

以上是关于2023.6.2 Linux重定向与管道的主要内容,如果未能解决你的问题,请参考以下文章

Linux管道符重定向与环境变量

Linux管道符和重定向与环境变量

Linux 重定向与管道

Linux重定向与管道

Linux管道及重定向

Linux重定向与管道简述