一文吃透 Linux 标准流、重定向、管道与 tee 命令(附 vim 实操案例)

一文吃透 vim编辑器的使用、Linux 标准流、重定向、管道与 tee 命令(附 vim 实操案例)

一、Linux中获取帮助

1、man手册

Linux中有许多的命令和选项 ,要想全部记住这些几乎不太现实,那我们就只能上网去搜索吗?这时候man手册就是我们的不二之选

1、man 简介

man,manual 简称。man使用不同 section 区分手册类别。

SECTION内容类型
1用户命令(可执行命令和shell程序)
2系统调用(从用户空间调用的内核例程)
3库函数(由程序库提供)
4特殊文件(如设备文件)
5文件格式(用于许多配置文件和结构)
6游戏(过去的有趣程序章节)
7惯例、标准和其他(协议、文件系统)
8系统管理和特权命令(维护任务)
9Linux内核API(内核调用)

2、man 命令

[xuhaoyu@centos7 ~18:34:25]$man--help#输出结果# Usage: man [OPTION...] [章节] 手册页...# -C, --config-file=文件 使用该用户设置文件# -d, --debug 输出调试信息# -D, --default 将所有选项都重置为默认值# --warnings[=警告] 开启 groff 的警告# ......

man手册页面交互操作指令(less程序)

命令结果
PageDown或者空格键向前(向下)滚动一个屏幕
PageUp向后(向上)滚动一个屏幕
向下箭头向前(向下)滚动一行
向上箭头向后(向上)滚动一行
d向前(向下)滚动半个屏幕
u向后(向上)滚动半个屏幕
/string在man page中向前(向下)搜索string
n在man page中重复之前的向前(向下)搜索
N在man page中重复之前的向后(向上)搜索
g转到man page的第一行。
G转到man page的最后一行。
q退出man ,并返回到shell命令提示符

3、运用 -k 搜索关键词

#查找 调整内核(kernel)[xuhaoyu@centos7 ~19:17:44]$man-kkernel# dmesg (8) - print or control the kernel ring buffer# abrt-action-analyze-oops (1) - Calculate and save UUID and duplicate hash for a problem data dir...# abrt-action-analyze-vmcore (1) - Extracts the oops message from the kernel core and install the ...# abrt-action-save-kernel-data (1) - Creates uReport mandatory files for kernel oopses.# abrt-oops.conf (5) - Configuration file for ABRT's Kernel Oops extractor# add_key (2) - add a key to the kernel's key management facility# adjtimex (2) - tune kernel clock# arp (7) - Linux ARP kernel module.

那如何更快速的查找到你需要的内容呢

答:运用管道

格式为 man -k a | grep b

#查找 调整内核(kernel)启动(boot)参数 手册[xuhaoyu@centos7 ~19:23:06]$man-kkernel|grepboot# bootparam (7) - introduction to boot time parameters of the Linux kernel# kernel-install (8) - Add and remove kernel and initramfs images to and from /boot# kexec (8) - directly boot into a new kernel# modules-load.d (5) - Configure kernel modules to load at boot# sysctl.d (5) - Configure kernel parameters at boot# systemd-modules-load (8) - Load kernel modules at boot# systemd-modules-load.service (8) - Load kernel modules at boot# systemd-sysctl (8) - Configure kernel parameters at boot# systemd-sysctl.service (8) - Configure kernel parameters at boot

二、which 和 whereis 命令

which命令就是查看这个词代表什么

[xuhaoyu@centos7 ~19:26:13]$whichvi# alias vi='vim'# /usr/bin/vim

whereis就是查看这个词在哪

[xuhaoyu@centos7 ~19:31:29]$whereispasswd#passwd: /usr/bin/passwd /etc/passwd /usr/share/man/man1/passwd.1.gz /usr/share/man/man5/passwd.5.gz

二、vim 编辑器

一款新手友好型编辑器

# 安装 vim 工具[root@centos7 ~]# yum install vim

1、vim模式

command模式:该模式下键盘中的字母有特殊含义。例如G,跳转到最后一行;gg,跳转到第一行。
edit模式:在command模式下按i,进入该模式。在该模式可以输入内容。在该模式下按Esc返回command模式。
extended command模式:在command模式下按:,进入该模式。在该模式下,可以保存文件(:w),退出编辑(:q),强制退出编辑(:q!),报错并退出(:wq)。
visual edit模式:在command模式下按v(单个字符选中)、V(整行选中)或者ctrl+v(按矩形选中),进入该模式。在该模式下,用于选中文件,随后可以复制或删除选中的内容。

2、快捷键

  1. 模式切换与文件操作

    快捷键功能说明
    i在光标进入插入模式:q退出 Vim(未修改时)
    a:w在光标进入插入模式:wq保存并退出
    esc返回普通模式:q!强制退出,放弃所有修改
    :w保存文件

2、定位文件内容

w向后一个word(光标在开头)$行尾
e向后一个word(光标在末尾){上一个自然段
b向前一个word}}下一个自然段
^0行首gg第一行
上一个句子头部G最后一行
)下一个句子尾部

less 使用g,第一行;G,最后一行。

3、进入插入模式

i当前位置插入A行末追加
I行首插入o向下新开一个空白行
adangqianweizhi1追加O向上新开一个空白行

4、复制:yy,复制1行,相当于y1y。以此类推 y2y y2w y2b。

5、粘贴:p 当前位置后粘贴,P 当前位置前粘贴

6、删除:

  • x,删除当前单个字符。5x,删除当前字符和后续4个字符。

  • X,删除前一单个字符。

  • dw,删除1个word,以此类推 d5w d3b d2d d$。

  • D,从当前删除到最后,相当于d$。

7、回退:

  • u,撤销上一个操作。

  • U,撤销整行修改。

  • Ctrl+r,反向撤销,与u相反。

8、修改,相当于删除后插入:

  • s,删除当前字符,并进入编辑模式。

  • S,删除当前行,并进入编辑模式。

  • c,代表替换动作,例如cw,删除1个word,并进入编辑模式。以此类推 c5w。

  • C,从当前删除到最后,并进入编辑模式。

8、替换:

  • r,替换单个字符后回退到命令行模式。

  • R,替换模式,一直替换直到按Ese返回命令行模式

示例:完成 DHCP 服务配置文件定制。

# 配置仓库[root@centos7 ~]# curl -s -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo[root@centos7 ~]# curl -s -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo# 安装dhcp软件[root@centos7 ~]# yum install -y dhcp# 准备配置文件[xuhaoyu@centos7 ~]$cp/usr/share/doc/dhcp*/dhcpd.conf.example ~/dhcpd.conf

编辑 ~/dhcpd.conf 文件:

  1. :set number showcmd,显示行号和操作命令
  2. gg,光标定位到第一行。
  3. d46d,删除当前行以及后面的45行。
  4. :11,28d,删除11到28行。
  5. /You,搜索字符串You,并定位到该字符位置。
  6. dG,删除当前位置行到最后。
  7. :%s/10.5.5/10.1.8/g,将所有行中10.5.5替换为10.1.8

% 针对所有内容,s查找并替换,g替换查找到的所有内容。

  1. /224,定位这个数字。
  2. cw,替换为0,然后esc。
  3. 30换成130
  4. 光标定位到ns1,修改dns为223.5.5.5:C然后输入223.5.5.5;
  5. 修改路由器为10.1.8.2,使用 r 替换末尾1为2。
  6. 修改广播地址10.1.8.3110.1.8.255
  7. ZZ,保存退出。

3、vim 配置

两个位置:

  • 全局:/etc/vimrc,给所有用户设置一些默认值。

    全局要进入管理员模式操作

  • 用户:~/.vimrc,特定用户的个性化设置。

常见的设置命令:

[xuhaoyu@centos7 ~]$vim~/.vimrcsetnumber# 显示行号setshowcmd# 显示操作命令setaits=2# ai,自动缩进;ts,tabspace使用2个空格代替,即首行缩进两格setcursorcolumn# 列高亮对齐显示setcursorline# 行高亮对齐显示

三、Linux 输入输出重定向

1、标准流的核心组成

  • stdin(标准输入,编号 0)
  • 是进程接收输入数据的通道,默认连接到键盘,程序通过它读取用户输入(如scanfread等操作会从stdin获取数据)。
  • 用法为仅读取(只能从该通道输入数据到进程)。
  • stdout(标准输出,编号 1)
  • 是进程输出正常结果的通道,默认连接到终端屏幕,程序的普通打印(如printfecho等)会输出到stdout
  • 用法为仅写入(进程只能向该通道输出数据)。
  • stderr(标准错误,编号 2)
  • 是进程输出错误信息的通道,默认也连接到终端屏幕,用于区分正常输出和错误提示(如程序崩溃、逻辑错误的提示信息)。
  • 用法为仅写入(专门用于输出错误内容)。
  • 3+ 号通道(其他文件,filename)
  • 代表进程与自定义文件的交互通道(非标准流),没有默认连接,需要手动指定文件。
  • 用法为读取和 / 或写入(可根据需求对文件进行读、写操作)。

流程逻辑

  • 输入:用户通过键盘向stdin输入数据,进程从stdin读取这些输入。
  • 输出:进程将正常结果写入stdout,错误信息写入stderr,两者默认都显示在终端;同时,进程也可通过 3+ 号通道与其他文件进行数据的读写交互。

这种模型是 Unix/Linux 系统中 “一切皆文件” 思想的体现,让进程能以统一的方式处理不同来源 / 目标的数据,也为重定向(Redirect)等操作(如把stdout输出到文件、把文件内容作为stdin输入)提供了基础。

2、标准输出重定向到文件

用法说明
>file重定向,以覆盖文件
>>file重定向,以附加到文件
2>file重定向,以覆盖文件
2>>file重定向,以附加文件
2>/dev/null将错误信息覆盖/dev/null
1(一般可省略不写)>/dev/null将正确信息覆盖/dev/null,从而把错误信息扔掉

示例:

# 将找到的文件名清单覆盖写入到passwd.list文件中[xuhaoyu@centos7 ~22:23:57]$find/etc-name'passwd'>passwd.list# find: ‘/etc/grub.d’: 权限不够# find: ‘/etc/pki/CA/private’: 权限不够# find: ‘/etc/pki/rsyslog’: 权限不够# find: ‘/etc/dhcp’: 权限不够# find: ‘/etc/selinux/targeted/active’: 权限不够# ...#在输出结果中看不到能找到的文件了,这是因为所以能找到的文件都被覆盖到passwd.list 中了#而这段代码的还是还是以find 查找查找 /etc 目录下 文件名是passwd的所有文件,而不是去查看passwd.list 中的文件#若要查看psswd.list 还是得用cat命令[xuhaoyu@centos7 ~22:24:20]$catpasswd.list# /etc/pam.d/passwd# /etc/passwd# 补充说明# 1>passwd.list可简写为>passwd.list# 1和>之间不能有空格# 将错误信息覆盖写入到passwd.err文件中[xuhaoyu@centos7 ~22:05:59]$find/etc-name'passwd'2>passwd.list# /etc/pam.d/passwd# /etc/passwd#输出结果为什么是这样,和上面说的一样#更简单 一步到位的方法[xuhaoyu@centos7 ~22:30:08]$find/etc-name'passwd'>passwd.list2>passwd.err#就像我们平时聊天一样,我今天吃饭了,我今天睡觉了 可简写为我今天吃饭睡觉了#把这段命令拆分下来为 find /etc -name 'passwd'# >passwd.list# 2>passwd.err# 将错误信息扔掉[xuhaoyu@centos7 ~22:27:30]$find/etc-name'passwd'2>/dev/null# /etc/pam.d/passwd# /etc/passwd# 将多个文件内容合并为1个[xuhaoyu@centos7 ~22:36:08]$cat/etc/fstab /etc/hosts>allinone# 用于清空文件内容,也可用于创建一个空文件testfile[xuhaoyu@centos7 ~22:32:38]$>testfile#相当于直接将屏幕(默认屏幕是没有任何东西的)覆盖testfile,用一个啥都没有的东西覆盖那不就是相当于清空嘛# 如果不存在,则创建一个文件;如果文件存在,则啥也不干。[xuhaoyu@centos7 ~22:31:53]$find/etc-name'passwd'>>passwd.list2>>passwd.err
&>file 相当于>file 2>&1重定向stdout和stderr以覆盖同一个文件
&>>file 相当于>>file 2>&1重定向stdout和stderr以附加同一个文件
# 同时将错误信息、正确信息 覆盖 写入到相同文件[xuhaoyu@centos7 ~]$find/etc-name'passwd'&>passwd.all# 同时将错误信息、正确信息 追加 写入到相同文件[xuhaoyu@centos7 ~]$find/etc-name'passwd'&>>passwd.all

3、标准输出重定向到程序

管道符(|)实现:将上一个命令的输出作为标准输入传递给下一个命令。

可以理解为“既要有要” ,同时满足多个要求,健达奇趣蛋说是

示例:查看哪个man page 可以resize ext4文件系统大小

# 搜索所有ext4相关手册,并保存到ext4.man文件中[xuhaoyu@centos7 ~]$man-kext4>ext4.man# 过滤ext4.man文件中含有resize的行[xuhaoyu@centos7 ~]$grepresizer ext4.man# 以上两个命令和合并为一行[xuhaoyu@centos7 ~]$man-kext4|grepresizer resize2fs(8)- ext2/ext3/ext4filesystem resizer# 示例2 获取ens33网卡ip地址[xuhaoyu@centos7 ~]$ipaddr|grep'ens33$'|awk'{print $2}'|cut-d/-f110.1.8.88

运用标准输出重定向到程序思想就是

[xuhaoyu@centos7 ~]$echo/etc/passwd|ls-l总用量2#-rw-rw-r--. 1 laoma laoma 0 12月 15 15:08 file#-rw-rw-r--. 1 laoma laoma 0 12月 15 15:08 file-a

1、tee命令

tee 命令作用,接收管道传递过来的stdin,并继续作为stdout输出

可以这么去理解:tee是一个分流器、三通水管
一边把命令输出打印到屏幕,一边同时写入文件;
普通重定向 > 只会存文件,屏幕看不到输出,tee 两者兼得。

[xuhaoyu@centos7 ~]$>passwd.list[xuhaoyu@centos7 ~]$catpasswd.list# tee命令覆盖保存到文件[xuhaoyu@centos7 ~]$find/etc-name'passwd'2>/dev/null|teepasswd.list#/etc/pam.d/passwd#/etc/passwd[xuhaoyu@centos7 ~]$catpasswd.list#/etc/pam.d/passwd#/etc/passwd# tee命令追加保存到文件[xuhaoyu@centos7 ~]$find/etc-name'passwd'2>/dev/null|tee-apasswd.list#/etc/pam.d/passwd#/etc/passwd[xuhaoyu@centos7 ~]$catpasswd.list#/etc/pam.d/passwd#/etc/passwd#/etc/pam.d/passwd#/etc/passwd# tee的标准输出继续通过管道传递下去[xuhaoyu@centos7 ~]$man-kpasswd|teepasswd.man|greppasswd

2、标准输入重定向给程序

运用 <

简单理解 > 和 < ,就看箭头指向谁,指向谁就是流向谁

# 常规查看文件[xuhaoyu@centos7 ~]$cat/etc/hosts127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6# cat 命令标准输入数据[xuhaoyu@centos7 ~]$cat</etc/hosts127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain#直观区分#cat 文件:cat 主动读文件#cat < 文件:shell 把文件塞给 cat 的输入流,cat 被动接收[xuhaoyu@centos7 ~]$cathello# 键盘输入hello后回车hello# 屏幕上显示helloctrl+d# 输入完成,退出# shell读取到EOF时候,代表标准输入完成[student@servera ~]$cat<<EOF>hello>world>EOF hello world[xuhaoyu@centos7 ~]$cat<<<'hello world'hello world