相信很多刚接触 Linux 的小伙伴都有过这种体验:

  • 遇到命令记不住参数,打开百度搜半天,结果教程版本不对,照着敲直接报错;

  • 第一次用 vim,进去之后不知道怎么退出,手足无措只能强行关终端;

  • 命令执行完结果满屏滚,想保存下来只能手动复制粘贴,长输出直接傻眼。

其实这些问题,根本不用靠百度解决 ——Linux 系统本身就内置了全套的 “官方攻略”,只是很多新手都没发现。

今天这篇就带大家一次性吃透 Linux 入门必学的 3 大核心技能:官方帮助系统、vim 编辑器、输入输出重定向

全程干货 + 实操,看完就能上手,帮你摆脱新手困境,效率直接拉满。


一、man 手册:Linux 自带的官方百科全书,遇事再也不求人

1.1 为什么你该优先学 man?

很多新手学 Linux 的第一个误区,就是死记硬背所有命令参数,背了忘、忘了背,效率极低。

man(manual 的缩写)是 Linux 系统自带的官方权威手册,从命令用法到配置文件格式,从系统调用到协议规范,几乎所有问题都能在这里找到标准答案。

它比百度靠谱 100 倍 —— 不会有版本错乱,不会有错误教程,随用随查,堪称 Linux 界的 “新华字典”。

1.2 9 大章节:别查错了 “字典分册”

man 手册不是一本厚书,而是按内容类型分成了 9 个章节(section)。新手最容易踩的坑,就是查错章节。

章节号内容类型通俗解释经典例子
1用户命令(可执行命令 / Shell 程序)我们平时敲的普通命令都在这man 1 passwd → 查「修改密码」的命令用法
5文件格式配置文件、数据结构的格式说明man 5 passwd → 查/etc/passwd文件的语法格式
8系统管理特权命令管理员用的系统维护命令man 8 resize2fs → 查文件系统扩容命令

最经典的踩坑现场:很多人查passwd,只知道它是改密码的命令,却不知道它还是个配置文件。直接敲man passwd默认只显示第 1 章,想查配置文件必须指定第 5 章。

1.3 翻阅手册:记住这几个快捷键就够了

打开 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命令提示符

1.4 进阶玩法:关键词搜索 + 英文原版

  • 使用root用户更新man page库

    [root@centos7 ~ 18:09:23]# mandb
    正在删除 /usr/share/man 里的旧数据库条目...
    mandb: 警告:/usr/share/man/man8/fsck.fat.8.manpage-fix.gz:忽略错误的文件名
    正在处理 /usr/share/man 下的手册页...
    正在为路径 /usr/share/man/man8 更新索引缓存。请等待...mandb: 警告:/usr/share/man/man8/fsck.fat.8.manpage-fix.gz:忽略错误的文件名
    完成。
    正在 /usr/share/man 下查找流浪猫...
    正在 /var/cache/man 下查找流浪猫...
    正在删除 /usr/share/man/hu 里的旧数据库条目...
    正在处理 /usr/share/man/hu 下的手册页...
    ... ...
    正在删除 /usr/local/share/man 里的旧数据库条目...
    正在处理 /usr/local/share/man 下的手册页...
    3 man subdirectories contained newer manual pages.
    93 manual pages were added.
    0 stray cats were added.
    0 old database entries were purged.
    
  • 模糊搜命令

    :记不清完整命令名?用 man -k 关键词可以全局搜索所有包含该关键词的手册。

    [jianghuilin@centos7 ~ 18:10:36]$ man -k passwd
    chgpasswd (8)        - 批量更新组密码
    chpasswd (8)         - 批量更新密码
    gpasswd (1)          - administer /etc/group and /etc/gshadow
    mkpasswd (1)         - 为用户产生新口令
    passwd (5)           - (未知的主题)
    smbpasswd (5)        - Samba加密的口令文件。
    smbpasswd (8)        - 改变用户的SMB口令
    yppasswd (1)         - 修改你在NIS数据库中的密码
    fgetpwent_r (3)      - get passwd file entry reentrantly
    getpwent_r (3)       - get passwd file entry reentrantly
    grub2-mkpasswd-pbkdf2 (1) - Generate a PBKDF2 password hash.
    lpasswd (1)          - Change group or user password
    lppasswd (1)         - add, change, or delete digest passwords.
    pam_localuser (8)    - require users to be listed in /etc/passwd
    passwd (1)           - update user's authentication tokens
    sslpasswd (1ssl)     - compute password hashes
    passwd2des (3)       - RFS password encryption
    pwhistory_helper (8) - Helper binary that transfers password hashes f...
    saslpasswd2 (8)      - set a user's sasl password
    vncpasswd (1)        - change the VNC password
    

    : 比如想找 ext4 文件系统调整相关的命令

    [jianghuilin@centos7 ~ 18:10:44]$ man -k ext4
    debugfs (8)          - ext2/ext3/ext4 file system debugger
    dumpe2fs (8)         - dump ext2/ext3/ext4 filesystem information
    e2fsck (8)           - check a Linux ext2/ext3/ext4 file system
    e2image (8)          - Save critical ext2/ext3/ext4 filesystem metada...
    e2label (8)          - Change the label on an ext2/ext3/ext4 filesystem
    e2undo (8)           - Replay an undo log for an ext2/ext3/ext4 files...
    e4defrag (8)         - online defragmenter for ext4 filesystem
    ext4 (5)             - the fourth extended file system
    filesystems (5)      - Linux file-system types: minix, ext, ext2, ext...
    fs (5)               - Linux file-system types: minix, ext, ext2, ext...
    fsck.ext2 (8)        - check a Linux ext2/ext3/ext4 file system
    fsck.ext3 (8)        - check a Linux ext2/ext3/ext4 file system
    fsck.ext4 (8)        - check a Linux ext2/ext3/ext4 file system
    mke2fs (8)           - create an ext2/ext3/ext4 filesystem
    mkfs.ext2 (8)        - create an ext2/ext3/ext4 filesystem
    mkfs.ext3 (8)        - create an ext2/ext3/ext4 filesystem
    mkfs.ext4 (8)        - create an ext2/ext3/ext4 filesystem
    resize2fs (8)        - ext2/ext3/ext4 file system resizer
    tune2fs (8)          - adjust tunable filesystem parameters on ext2/e...
    [jianghuilin@centos7 ~ 18:12:50]$ man resize2fs
    
  • 看英文原版手册

    :中文翻译偶尔会晦涩难懂,临时切换成英文更准确:

    # 查看命令gedit英文的帮助手册,指定LANG变量
    [jianghuilin@centos7 ~ 18:13:16]$ LANG=en_US.utf8 man gedit
    # 或者
    [jianghuilin@centos7 ~ 18:15:39]$ LANG=en_US.utf8
    [jianghuilin@centos7 ~ 18:16:45]$ man gedit
    

1.5 补全:所有查帮助的姿势,一次说全

不是所有命令都适合用 man 查,不同场景用不同工具:

  1. Shell 内置命令用 help,像cd、history这种 Shell 自带的命令,man 查不到详细内容,用 help 命令名

    [jianghuilin@centos7 ~ 18:16:55]$ help history
    
  2. 通用神器 --help

    几乎所有外部命令都支持 –help选项,快速看参数说明,比 man 更简洁:

    [jianghuilin@centos7 ~ 18:24:05]$ touch --help
    Usage: touch [OPTION]... FILE...
    Update the access and modification times of each FILE to the current time.
    
    A FILE argument that does not exist is created empty, unless -c or -h
    is supplied.
    
    A FILE argument string of - is handled specially and causes touch to
    change the times of the file associated with standard output.
    
    Mandatory arguments to long options are mandatory for short options too.
      -a                     change only the access time
      -c, --no-create        do not create any files
      -d, --date=STRING      parse STRING and use it instead of current time
      -f                     (ignored)
      -h, --no-dereference   affect each symbolic link instead of any referenced
                             file (useful only on systems that can change the
                             timestamps of a symlink)
      -m                     change only the modification time
      -r, --reference=FILE   use this file's times instead of current time
      -t STAMP               use [[CC]YY]MMDDhhmm[.ss] instead of current time
          --time=WORD        change the specified time:
                               WORD is access, atime, or use: equivalent to -a
                               WORD is modify or mtime: equivalent to -m
          --help     display this help and exit
          --version  output version information and exit
    
    Note that the -d and -t options accept different time-date formats.
    
    GNU coreutils online help: <http://www.gnu.org/software/coreutils/>
    For complete documentation, run: info coreutils 'touch invocation'
    
  3. **/usr/share/doc:**示例配置宝库

    很多软件会把官方示例、配置模板、使用说明放在这里,搭服务的时候直接抄模板香到爆:

    cat /usr/share/doc/dhclient-4.2.5/dhclient.conf.example
    
  4. 找命令位置:which 和 whereis

    • which 命令:看命令的可执行文件路径,还能显示别名
    [jianghuilin@centos7 ~ 18:24:15]$ which vi
    alias vi='vim'
    	/usr/bin/vim
    
    • whereis 命令:一次性找到二进制文件、手册、源码的所有位置
    [jianghuilin@centos7 ~ 18:28:56]$ whereis man
    man: /usr/bin/man /usr/share/man /usr/share/man/man1/man.1.gz /usr/share/man/man1p/man.1p.gz /usr/share/man/man7/man.7.gz
    [jianghuilin@centos7 ~ 18:29:05]$ whereis passwd
    passwd: /usr/bin/passwd /etc/passwd /usr/share/man/man1/passwd.1.gz /usr/share/man/man5/passwd.5.gz
    

二、vim 编辑器:从 “进去就退不出” 到 “单手高效编辑”

2.1 为什么一定要学 vim?

说到 vim,新手的第一反应往往是 “反人类”—— 没有菜单,不能用鼠标,进去了甚至不知道怎么退出来。

但它是 Linux 服务器上的标配编辑器:纯字符界面的服务器上,没有记事本,没有 VS Code,只有 vim 是 100% 预装的。

而且一旦用熟,你会发现它是为 “手不离开键盘” 设计的神器,编辑速度比鼠标点来点去快十倍。

vim版本,Linux 系统中可以安装vim三个不同版本:

  • vim-minimal:只提供vi和相关命令。
  • vim-enhanced:提供vim命令,提供语法高亮拼写检查等特性。
  • vim-X11:提供gvim,图形界面下的vim。gvim包涵菜单栏。当用户不知道命令的时候,可以通过菜单操作。
# 安装 vim 工具
[root@centos7 ~ 18:32:26]# yum install vim

冷知识:据说有 80% 的 Linux 新手,第一次用 vim 时因为不知道怎么退出,直接关掉了终端… 看完这节,你再也不会闹这种笑话。

2.2 搞懂 4 种模式,vim 就入门了一半

在这里插入图片描述

vim 的核心逻辑就是**「模式切换」**,很多人觉得难用,本质是没搞懂不同模式的作用。

  1. 命令模式(默认模式)

    打开 vim 默认进入这个模式,你敲的所有键盘都会被当成快捷键,用来移动光标、复制删除、跳转。

  2. 输入模式

    正常打字写内容的模式。在命令模式按i 就能进入,按Esc退回命令模式。

  3. 底行模式(扩展命令模式)

    用来保存、退出、全局替换等操作。命令模式按: 进入,回车执行后自动退回命令模式。

  4. 可视模式

    command模式下按 v(单个字符选中)、V(整行选中)或者ctrl+v(按矩形选中),进入该模式。在该模式下,用于选中文件,随后可以复制或删除选中的内容。

新手保命技巧:不知道自己在啥模式的时候,多按几次Esc,总能退回最安全的命令模式。

2.3 高频快捷键:记住这几个,日常编辑够用了

在这里插入图片描述

不用上来就背几百个快捷键,先掌握最常用的,边用边记效率最高。

光标移动(告别方向键)
  • gg:跳到文件第一行
  • G:跳到文件最后一行
  • 0/^:跳到行首
  • $:跳到行尾
  • w,向后1个word(光标在单词开头);e,向后1个word(光标在单词末尾)
  • b:向前跳一个单词
复制粘贴删除
  • yy:复制当前行(3yy就是复制 3 行)
  • p:在光标后粘贴
  • P : 在光标后前粘贴
  • dd:删除当前行(3dd就是删除 3 行)
  • x,删除当前单个字符。5x,删除当前字符和后续4个字符。
  • X,删除前一单个字符。
  • dw,删除1个word,以此类推 d5w d3b d2d d$。
  • D,从当前删除到最后,相当于d$。
撤销与重做
  • u:撤销上一步操作(相当于 Windows 的 Ctrl+Z)
  • U,撤销整行修改。
  • Ctrl+r:重做,恢复被撤销的操作
修改

相当于删除后插入:

  • s,删除当前字符,并进入编辑模式。
  • S,删除当前行,并进入编辑模式。
  • c,代表替换动作,例如cw,删除1个word,并进入编辑模式。以此类推 c5w。
  • C,从当前删除到最后,并进入编辑模式。
替换
  • r,替换单个字符后回退到命令行模式。
  • R,替换模式,一直替换直到按Ese返回命令行模式。
进入输入模式(最常用的 6 个)
  • i:光标当前位置插入
  • a:光标后追加
  • o:光标下方新开一行并进入输入
  • I:行首插入
  • A:行尾插入
  • O:光标上方新开一行
底行模式常用命令
  • :w:保存文件
  • :q:退出(文件未修改时)
  • :wq:保存并退出
  • :q!:强制退出,不保存修改
  • :set number:显示行号
  • :%s/旧内容/新内容/g:全局替换字符串

2.4 实操练手:修改 DHCP 配置文件

光说不练假把式,我们做个小练习,把上面的命令串起来用一遍:

# 安装dhcp软件
[root@centos7 ~]# yum install -y dhcp
# 先复制一份官方示例配置到家目录
cp /usr/share/doc/dhcp*/dhcpd.conf.example ~/dhcpd.conf
vim ~/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替换查找到的所有内容。

8./224,定位这个数字。

9.cw,替换为0,然后esc。

10.将30换成130

11.光标定位到ns1,修改dns为223.5.5.5:C然后输入223.5.5.5;

12.修改路由器为10.1.8.2,使用 r 替换末尾1为2。

13.修改广播地址10.1.8.3110.1.8.255

​ 14.ZZ,保存退出。

在这里插入图片描述

2.5 打造专属 vim:个性化配置

两个位置:

  • 全局:/etc/vimrc,给所有用户设置一些默认值。
  • 用户:~/.vimrc,特定用户的个性化设置。

常见的设置命令:

[jianghuilin@centos7 ~ 18:54:53]$ vim ~/.vimrc
set number      " 显示行号
set showcmd     " 实时显示输入的命令
set ai ts=2     " 自动缩进,Tab用2个空格代替
set cursorline  " 高亮当前行,方便定位
set cursorcolumn  " 列高亮对齐显示

保存退出后,再打开 vim 就会自动生效,编辑体验直接上一个台阶。


三、IO 重定向:解锁命令行的灵魂玩法,效率直接翻倍

3.1 什么是输入输出重定向?

在这里插入图片描述

很多人用 Linux 命令,执行完结果就显示在屏幕上,想保存还得手动复制。

其实 Linux 里每个运行的程序,都默认有 3 个「数据流通道」,这是 Unix “一切皆文件” 思想的核心体现:

通道编号名称默认连接作用
0标准输入(stdin)键盘程序从这里读取输入数据
1标准输出(stdout)终端屏幕程序把正常运行结果输出到这里
2标准错误(stderr)终端屏幕程序把报错、异常信息输出到这里

重定向,就是改变这些数据流的去向:不让结果显示在屏幕上,而是写到文件里;不让程序从键盘读输入,而是从文件里读。

3.2 输出重定向:把结果存进文件

在这里插入图片描述

这是最常用的场景,核心符号就两个:

  • >:覆盖写入(文件原有内容会被清空)
  • >>:追加写入(在文件末尾添加内容,不覆盖原有内容)
基础用法
# 把find命令的正常结果覆盖写入passwd.list
[jianghuilin@centos7 ~ 18:55:30]$ find /etc -name 'passwd' > passwd.listfind: ‘/etc/grub.d’: Permission denied
find: ‘/etc/pki/CA/private’: Permission denied
find: ‘/etc/pki/rsyslog’: Permission denied
find: ‘/etc/dhcp’: Permission denied
... ...

# 注:> 默认就是标准输出重定向,前面的1可以省略  
# 1>passwd.list可简写为>passwd.list
# 1和>之间不能有空格

[jianghuilin@centos7 ~ 19:01:24]$ cat passwd.list
/etc/pam.d/passwd
/etc/passwd

# 将多个文件内容合并为一个
[jianghuilin@centos7 ~ 19:01:35]$ cat /etc/fstab /etc/hosts > allinone

# 将找到的文件名清单追加写入到passwd.list文件中
[jianghuilin@centos7 ~ 19:04:59]$ find /etc -name 'passwd' 1>>passwd.list
find: ‘/etc/grub.d’: Permission denied
find: ‘/etc/pki/CA/private’: Permission denied
find: ‘/etc/pki/rsyslog’: Permission denied
... ...
[jianghuilin@centos7 ~ 19:05:43]$ cat passwd.list
/etc/pam.d/passwd
/etc/passwd
/etc/pam.d/passwd
/etc/passwd
错误输出重定向

普通用户执行find遍历系统目录,经常跳出一堆 “权限不够” 的报错,看着很烦。用错误重定向就能完美解决:

# 将错误信息覆盖写入到passwd.err文件中
[jianghuilin@centos7 ~ 19:05:54]$ find /etc -name 'passwd' 2>passwd.err
/etc/pam.d/passwd
/etc/passwd
[jianghuilin@centos7 ~ 19:08:26]$ cat passwd.err
find: ‘/etc/grub.d’: Permission denied
find: ‘/etc/pki/CA/private’: Permission denied
find: ‘/etc/pki/rsyslog’: Permission denied
......
find: ‘/etc/sudoers.d’: Permission denied

# 把错误信息扔进“黑洞”,只看正常结果
[jianghuilin@centos7 ~ 19:08:35]$ find /etc -name 'passwd' 2>/dev/null
/etc/pam.d/passwd
/etc/passwd

# 将错误信息追加写入到passwd.err文件中
[jianghuilin@centos7 ~ 19:09:59]$ find /etc -name 'passwd' 2>>passwd.err
/etc/pam.d/passwd
/etc/passwd
[jianghuilin@centos7 ~ 19:12:32]$ cat passwd.err
find: ‘/etc/grub.d’: Permission denied
find: ‘/etc/pki/CA/private’: Permission denied
find: ‘/etc/pki/rsyslog’: Permission denied
......

/dev/null是 Linux 里的 “无底黑洞”,扔进去的内容都会永久消失,专门用来丢弃没用的输出。

正常 + 错误存到不同文件
# 将错误信息、正确信息 覆盖 写入到不同文件
[jianghuilin@centos7 ~ 19:16:18]$ find /etc -name 'passwd' >passwd.list 2>passwd.err

# 将错误信息、正确信息 追加 写入到不同文件
[jianghuilin@centos7 ~ 19:17:32]$ find /etc -name 'passwd' >>passwd.list 2>>passwd.err
正常 + 错误存到同一个文件,用&>
# 同时将错误信息、正确信息 覆盖 写入到相同文件
[jianghuilin@centos7 ~ 19:18:30]$ find /etc -name 'passwd' &> passwd.all
# 同时将错误信息、正确信息 追加 写入到相同文件
[jianghuilin@centos7 ~ 19:21:40]$ find /etc -name "passwd' &>> passwd.all
> 和 >> 后面直接加文件名
# 用于清空文件内容,也可用于创建一个空文件test.file
[jianghuilin@centos7 ~ 19:22:42]$ > test.file

# 如果不存在,则创建一个文件;如果文件存在,则啥也不干
[jianghuilin@centos7 ~ 19:25:47]$ >> test.file

3.3 管道符 |:命令组合的精髓

如果说重定向是 “把输出存到文件”,那**管道符|**就是 “把前一个命令的输出,直接当成后一个命令的输入”,不用中间文件,一步到位。

这是 Linux 命令行最有魅力的地方 —— 像搭积木一样组合简单命令,实现复杂功能

在这里插入图片描述

举个例子,找 ext4 相关的调整命令:

# 不用管道的笨办法:先存文件再过滤
# 查看哪个man page 可以resize ext4文件系统大小

# 搜索所有ext4相关手册,并保存到ext4.man文件中
[jianghuilin@centos7 ~ 19:26:02]$ man -k ext4 > ext4.man

# 过滤ext4.man文件中含有resize的行
[jianghuilin@centos7 ~ 19:30:00]$ grep resizer ext4.man
resize2fs (8)        - ext2/ext3/ext4 file system resizer

# 用管道的优雅写法:一行搞定
[jianghuilin@centos7 ~ 19:30:27]$ man -k ext4 | grep resizer 
resize2fs (8)        - ext2/ext3/ext4 file system resizer

再比如,获取ens33网卡ip地址, 多命令无缝组合:

[jianghuilin@centos7 ~ 19:34:54]$ ip addr | grep 'ens33$' | awk '{print $2}'| cut -d/ -f1
10.1.8.10

**注意:**管道符号后的命令必须能够接收标准输入,例如 ls ====接收管道传递过来的标准输入。

[jianghuilin@centos7 ~ 20:28:35]$ echo /etc/passwd | ls -l
总用量 2
-rw-rw-r--. 1 jianghuilin jianghuilin  0 716 15:08 file
-rw-rw-r--. 1 jianghuilin jianghuilin  0 716 15:08 file-a 

补充:|& 标准错误和标准输出同时传递给下一个命令,作为下一个命令的标准输入。

[student@servera ~]$ ls -l file-{01..06}
ls: cannot access 'file-04': No such file or directory
ls: cannot access 'file-05': No such file or directory
ls: cannot access 'file-06': No such file or directory
-rw-rw-r--. 1 student student 0 Dec 24 14:53 file-01
-rw-rw-r--. 1 student student 0 Dec 24 14:53 file-02
-rw-rw-r--. 1 student student 0 Dec 24 14:53 file-03

[student@servera ~]$ ls -l file-{01..06} |grep file-06
ls: cannot access 'file-04': No such file or directory
ls: cannot access 'file-05': No such file or directory
ls: cannot access 'file-06': No such file or directory

[student@servera ~]$ ls -l file-{01..06} |grep file-03
ls: cannot access 'file-04': No such file or directory
ls: cannot access 'file-05': No such file or directory
ls: cannot access 'file-06': No such file or directory
-rw-rw-r--. 1 student student 0 Dec 24 14:53 file-03

# |&
[student@servera ~]$ ls -l file-{01..06} |& grep file-06
ls: cannot access 'file-06': No such file or directory

3.4 tee 命令:一边存文件,一边传输

在这里插入图片描述

有时候我们既想把命令结果存到文件备份,又想让它继续传给后面的命令过滤,这时候就用tee命令,相当于一个 “三通水管”。

# 创建空文件并查看
[jianghuilin@centos7 ~ 19:36:27]$ > passwd.list
[jianghuilin@centos7 ~ 19:38:54]$ cat passwd.list

# 屏幕直接打印查到的文件,同时把内容覆盖写入 passwd.list 文件
[jianghuilin@centos7 ~ 19:39:04]$ find /etc -name 'passwd' 2>/dev/null | tee passwd.list
/etc/pam.d/passwd
/etc/passwd
[jianghuilin@centos7 ~ 19:40:32]$ cat passwd.list
/etc/pam.d/passwd
/etc/passwd

# 屏幕直接打印查到的文件,同时把内容追加写入 passwd.list 文件
[jianghuilin@centos7 ~ 19:40:40]$ find /etc -name 'passwd' 2>/dev/null | tee -a passwd.list
/etc/pam.d/passwd
/etc/passwd
[jianghuilin@centos7 ~ 19:45:12]$ cat passwd.list
/etc/pam.d/passwd
/etc/passwd
/etc/pam.d/passwd
/etc/passwd
tee 配合管道继续传给下一条命令(对应图里右边第二个进程)

tee 分流后,数据不会断掉,还能继续往后传递过滤、处理

示例:找到 passwd 文件,一边存文件,一边只打印带 pam 的行

# find 输出所有文件  tee:复制一份存 all_result;另一份继续往右流
# 流进 grep 过滤,屏幕只输出 /etc/pam.d/passwd
[jianghuilin@centos7 ~ 19:45:18]$ find /etc -name 'passwd' | tee all_result | grep pam
find: ‘/etc/grub.d’: Permission denied
find: ‘/etc/pki/CA/private’: Permission denied
find: ‘/etc/pki/rsyslog’: Permission denied
find: ‘/etc/dhcp’: Permission denied
/etc/pam.d/passwd
find: ‘/etc/selinux/targeted/active’: Permission denied
... ...
find: ‘/etc/sudoers.d’: Permission denied
tee命令极简记忆口诀

管道数据过 tee,一分为两条流;
一路屏幕看得见,一路存入文档头;
加 - a 尾部追加写,不加直接全覆盖。

3.5 输入重定向:让程序从文件读数据

输入重定向用<,让程序不从键盘读取,而是直接从文件里读内容:

# 两种写法效果一致,都是查看文件内容
[jianghuilin@centos7 ~ 19:52:38]$ cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
[jianghuilin@centos7 ~ 19:56:08]$ cat < /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

直接敲 cat 回车:默认从键盘读输入

[jianghuilin@centos7 ~ 20:02:34]$ cat 
hello  # 键盘输入hello后回车
hello  # 屏幕上显示hello
ctrl+d # 输入完成,退出

cat << EOF:多行嵌入文档(Here Document)

不用按 Ctrl+D 结束,你自己定一个「结束暗号」(这里是 EOF);

shell 会把暗号之间的所有多行内容,整块喂给 cat 当输入。

# shell读取到EOF时候,代表标准输入完成
[jianghuilin@centos7 ~ 20:08:29]$ cat << EOF
> hello
> world
> EOF
hello
world

cat <<< 'hello world':单行嵌入字符串(Here String)

上面 << EOF 是多行版,这个 <<< 就是单行简化版:

直接把后面的一整串文字,喂给命令当输入,不用写结束标记,一行搞定。

# shell 看到 <<<,直接把后面的 hello world 这串字符串,送到 cat 的进水口(标准输入)
# cat 读到这串内容,立刻原样打印到屏幕,然后自动结束
[jianghuilin@centos7 ~ 20:09:42]$ cat <<< 'hello world'
hello world

判定一个命令是否接收标准输入:最简单的方式就是将文件内容作为标准输入重定向给程序。

还有个写脚本超实用的技巧:多行输入重定向<<EOF,一次性写入多行内容,不用反复 echo:

# 使用cat重定向
[jianghuilin@centos7 ~ 19:56:19]$ cat > multi_lines.txt << EOF
> hello world
> hello python
> hello linux
> EOF

#使用引号一次性写入多行内容
[jianghuilin@centos7 ~ 19:59:12]$ echo 'hello world
> hello python
> hello linux'>multi_lines.txt
[jianghuilin@centos7 ~ 20:02:26]$ cat multi_lines.txt
hello world
hello python
hello linux

执行完之后,三行文字就直接写入文件了,写配置、写脚本的时候特别方便。

最后

今天讲的这三个技能,是 Linux 入门的「三板斧」:

  • man 手册让你遇事不求人,摆脱对搜索引擎的依赖,学到的都是官方标准答案;
  • vim 让你在任何服务器上都能流畅编辑文本,是运维和开发的必备基本功;
  • 重定向和管道则打开了命令行的组合玩法,是 Linux 效率的核心来源。

Linux 学习从来不是死记硬背,而是边用边练,敲得多了自然就熟了。建议大家打开自己的虚拟机,跟着文中的例子亲手敲一遍,印象会深刻很多。

你学 Linux 的时候,遇到过最搞笑的坑是什么?欢迎在评论区留言交流~

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐