一文吃透 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 | 系统管理和特权命令(维护任务) |
| 9 | Linux内核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/vimwhereis就是查看这个词在哪
[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 vim1、vim模式
command模式:该模式下键盘中的字母有特殊含义。例如G,跳转到最后一行;gg,跳转到第一行。
edit模式:在command模式下按i,进入该模式。在该模式可以输入内容。在该模式下按Esc返回command模式。
•extended command模式:在command模式下按:,进入该模式。在该模式下,可以保存文件(:w),退出编辑(:q),强制退出编辑(:q!),报错并退出(:wq)。
visual edit模式:在command模式下按v(单个字符选中)、V(整行选中)或者ctrl+v(按矩形选中),进入该模式。在该模式下,用于选中文件,随后可以复制或删除选中的内容。
2、快捷键
模式切换与文件操作
快捷键 功能说明 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 | 向下新开一个空白行 |
| a | dangqianweizhi1追加 | 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 文件:
:set number showcmd,显示行号和操作命令gg,光标定位到第一行。d46d,删除当前行以及后面的45行。:11,28d,删除11到28行。/You,搜索字符串You,并定位到该字符位置。dG,删除当前位置行到最后。:%s/10.5.5/10.1.8/g,将所有行中10.5.5替换为10.1.8。
% 针对所有内容,s查找并替换,g替换查找到的所有内容。
/224,定位这个数字。cw,替换为0,然后esc。- 将
30换成130。 - 光标定位到
ns1,修改dns为223.5.5.5:C然后输入223.5.5.5;。 - 修改路由器为
10.1.8.2,使用 r 替换末尾1为2。 - 修改广播地址
10.1.8.31为10.1.8.255。 ZZ,保存退出。
3、vim 配置
两个位置:
全局:
/etc/vimrc,给所有用户设置一些默认值。全局要进入管理员模式操作
用户:
~/.vimrc,特定用户的个性化设置。
常见的设置命令:
[xuhaoyu@centos7 ~]$vim~/.vimrcsetnumber# 显示行号setshowcmd# 显示操作命令setaits=2# ai,自动缩进;ts,tabspace使用2个空格代替,即首行缩进两格setcursorcolumn# 列高亮对齐显示setcursorline# 行高亮对齐显示三、Linux 输入输出重定向
1、标准流的核心组成
- stdin(标准输入,编号 0):
- 是进程接收输入数据的通道,默认连接到键盘,程序通过它读取用户输入(如
scanf、read等操作会从stdin获取数据)。 - 用法为仅读取(只能从该通道输入数据到进程)。
- stdout(标准输出,编号 1):
- 是进程输出正常结果的通道,默认连接到终端屏幕,程序的普通打印(如
printf、echo等)会输出到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.all3、标准输出重定向到程序
管道符(|)实现:将上一个命令的输出作为标准输入传递给下一个命令。
可以理解为“既要有要” ,同时满足多个要求,健达奇趣蛋说是
示例:查看哪个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-a1、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|greppasswd2、标准输入重定向给程序
运用 <
简单理解 > 和 < ,就看箭头指向谁,指向谁就是流向谁
# 常规查看文件[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