ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Bash 常用操作与历史参数复用

Bash 常用操作与历史参数复用

Bash 常用操作与历史参数复用

一、目录快速跳转与历史参数复用

  1. 进入上级目录
cd..

向上多级示例:cd ../..进入上两级目录。

  1. 切换回上一次所在目录
cd-

执行后输出目标路径,该行为依赖环境变量OLDPWD。

  1. 复用前一条命令末尾参数
mkdir-p/home/ascend/ansiblecd!$
  • !$:Bash 历史扩展(history expansion)中的词指示符(word designator),展开为上一条命令的最后一个参数。
  • $_:Bash 内置特殊参数,展开为上一条命令执行前经 shell 扩展后的最后一个参数。
  • 交互式快捷键:输入cd后按Alt + .(或Esc + .),由 readline 插入上一条命令的最后一个参数。

!$与$_存在差异:!$取自历史行原始文本,$_取自经 shell 扩展后的实际参数。例如echo "$(date +%s)"后,!$展开为字面量$(date +%s),$_展开为date命令实际输出的时间戳。

  1. 使用变量固定路径,多次复用
TARGET=/home/ascend/ansiblemkdir-p"$TARGET"cd"$TARGET"

如需长期使用,可在~/.bashrc中配置别名:

aliasansible_work='cd /home/ascend/ansible'

二、命令行复制与粘贴

X11 环境下存在多套独立缓冲区,需区分对待:

  • PRIMARY:鼠标选中文本时自动写入,中键点击粘贴。
  • CLIPBOARD:由显式复制操作(如Ctrl + Shift + C)写入,由显式粘贴操作(如Ctrl + Shift + V)读取。
  • readline 剪切环(kill ring):Bash 行编辑内部维护的文本环,与上述 X11 缓冲区互不互通。
  1. 图形终端(GNOME Terminal、MobaXterm、SecureCRT)
  • 复制:Ctrl + Shift + C
  • 粘贴:Ctrl + Shift + V
  • X11 PRIMARY 特性:鼠标划选文本自动存入 PRIMARY 缓冲区,鼠标中键点击完成粘贴。
  1. tmux 环境(默认前缀键Ctrl+B)
  • Ctrl+B后按[:进入复制模式,空格键开始选区,回车键确认复制。
  • Ctrl+B后按]:粘贴 tmux 内部缓冲区内容。
  1. 纯字符控制台(tty)

无 X11 剪贴板,仅可使用 readline 剪切环完成行内剪切粘贴。

注意:Ctrl+C作用为向前台进程发送 SIGINT 信号以终止其运行,不是复制。

三、readline 行编辑快捷键(Bash 默认 Emacs 模式)

快捷键功能说明
Ctrl + A光标跳转至行首
Ctrl + E光标跳转至行尾
Ctrl + B光标左移一个字符
Ctrl + F光标右移一个字符
Alt + B光标左移一个单词
Alt + F光标右移一个单词
Ctrl + U剪切光标左侧全部内容(行首至光标)
Ctrl + K剪切光标右侧全部内容(光标至行尾)
Ctrl + W剪切光标左侧一个单词
Alt + D删除光标右侧一个单词
Ctrl + Y粘贴 readline 剪切环内最近一次内容
Alt + Y在Ctrl + Y后循环切换剪切环中更早的内容
Ctrl + D删除光标处字符;空命令行时退出 shell
Ctrl + H删除光标左侧字符,等效退格键
Ctrl + L清屏,等效clear
Ctrl + R反向检索命令历史,输入关键词匹配
Ctrl + G退出反向搜索模式
↑ / ↓上下翻阅历史命令

readline 默认使用 Emacs 编辑模式,可在~/.inputrc中通过set editing-mode vi切换为 Vi 模式。

典型使用场景

  • 长命令需修改开头:Ctrl+A跳转行首修改。
  • 未完成命令临时执行其他操作:Ctrl+U剪切,执行其他命令后Ctrl+Y恢复。
  • 调取过往 Ansible 调试命令:Ctrl+R,输入ansible检索匹配条目,回车执行。

四、标准流、重定向与管道

4.1 标准流

每个进程默认继承三个标准流:

流文件描述符默认来源/去向
stdin0终端键盘输入
stdout1终端屏幕输出
stderr2终端屏幕输出(独立于 stdout)

4.2 重定向

语法含义
cmd > filestdout 重定向至 file(覆盖)
cmd >> filestdout 追加至 file
cmd < file从 file 读取 stdin
cmd 2> filestderr 重定向至 file
cmd 2>> filestderr 追加至 file
cmd 2>&1stderr 重定向至 stdout
cmd > file 2>&1stdout 与 stderr 合并重定向至 file
cmd &> file同上,Bash 简写形式
cmd &>> filestdout 与 stderr 合并追加至 file
cmd > /dev/null丢弃 stdout
cmd &> /dev/null丢弃 stdout 与 stderr

示例:

# 覆盖写入echo"hello">output.txt# 追加写入echo"world">>output.txt# 错误重定向grep"pattern"nonexistent.txt2>error.log# 合并 stdout 与 stderrls/nonexistent /etc>out.log2>&1# 丢弃全部输出some_command&>/dev/null

注意:重定向按从左到右顺序处理,ls > dirlist 2>&1与ls 2>&1 > dirlist效果不同。

4.3 管道

管道符|将前一个命令的 stdout 作为后一个命令的 stdin:

# 过滤进程psaux|grepnginx# 统计文件数量find.-name'*.sh'|wc-l# 分页显示ls-l/etc|less

stderr 默认不进入管道,需显式合并:

cmd2>&1|next_cmd

4.4 高级用法

Here Document / Here String

# Here Documentcat<<EOF line1 line2 EOF# Here Stringgrep"pattern"<<<"input text"

进程替换(Process Substitution)

diff<(sortfile1)<(sortfile2)

tee:同时输出至终端与文件

# 实时查看日志并保存副本tail-f/var/log/syslog|teeoutput.log

五、命令执行控制

操作符含义
cmd1 ; cmd2顺序执行,不依赖前一条命令退出状态
cmd1 && cmd2cmd1 退出状态为 0 时才执行 cmd2
cmd1 || cmd2cmd1 退出状态非 0 时才执行 cmd2
cmd &后台执行 cmd
`cmd1cmd2`

示例:

# 顺序执行date;tar-czfbackup.tar.gz /etc;date# 条件执行mkdir-p/home/ascend/ansible&&cd/home/ascend/ansible# 成功/失败分支ls/nonexistent&&echo"ok"||echo"failed"# 后台执行ansible-playbook site.yml&

六、文本处理三剑客:grep、sed、awk

三者核心定位:

  • grep:按模式搜索/过滤行。
  • sed:流式编辑,按行执行替换、删除、插入。
  • awk:按字段(列)处理结构化文本,支持条件筛选与聚合计算。

选择口诀:找行用 grep,改行用 sed,算列用 awk。

6.1 grep(文本搜索)

语法:grep [选项] '模式' 文件

选项说明
-i忽略大小写
-v反向匹配(排除匹配行)
-n显示行号
-c统计匹配行数
-r/-R递归搜索目录
-l/-L仅显示匹配/不匹配的文件名
-w全词匹配
-o仅输出匹配部分
-A n/-B n/-C n显示匹配行后/前/前后 n 行
-E使用扩展正则表达式(ERE)
-P使用 Perl 正则(PCRE)
-F固定字符串匹配(禁用正则)
-q静默模式,仅返回退出码

示例:

# 基础搜索grep'error'app.loggrep-i'error'app.log# 忽略大小写grep-v'debug'app.log# 排除 debug 行# 行号与统计grep-n'error'log.txtgrep-c'error'log.txt# 递归搜索grep-r'TODO'./src/grep-rl'TODO'./src/# 仅显示文件名# 上下文grep-C2'Exception'log.txt# 前后各 2 行grep-A3'error'log.txt# 匹配行及后 3 行# 多条件grep-e'error'-e'warn'log.txt# OR 匹配grep'error'log.txt|grep'disk'# AND 匹配(管道)# 正则grep-E'^[0-9]+'file.txt# 以数字开头grep-E'foo|bar'file.txt# foo 或 bargrep-P'\d{3}-\d{4}'file.txt# Perl 正则grep-F'literal.string'file.txt# 固定字符串,不解释正则

6.2 sed(流编辑器)

语法:sed [选项] '命令' 文件

选项说明
-i直接修改原文件(建议配合.bak备份)
-n抑制默认输出,仅打印显式p指定的内容
-e执行多个命令
-E/-r使用扩展正则表达式(ERE)

常用编辑命令:

命令说明
s/old/new/g替换(g为全局替换)
d删除行
p打印行(常与-n配合)
a\行后追加
i\行前插入
c\替换整行

示例:

# 替换(不修改原文件,仅输出)sed's/old/new/g'file.txt# 原地修改(建议先备份)sed-i.bak's/old/new/g'file.txt# 删除行sed'/debug/d'file.txt# 删除含 debug 的行sed'1d'file.txt# 删除第 1 行sed'$d'file.txt# 删除最后一行sed'1,10d'file.txt# 删除第 1-10 行# 插入/追加sed'3a\=== new line ==='file.txt# 第 3 行后追加sed'3i\=== new line ==='file.txt# 第 3 行前插入# 多命令sed-e's/error/ERROR/g'-e's/warn/WARN/g'file.txt# 截取指定行sed-n'10,20p'file.txt# 仅输出第 10-20 行sed-n'/2024-07-01/,/2024-07-02/p'file.txt# 按区间截取# 删除空白行sed'/^$/d'file.txt

6.3 awk(文本分析)

语法:awk [选项] '模式 {动作}' 文件

常用内置变量:

变量含义
$0整行内容
$1,$2, …第 1、2… 列字段
$NF最后一列
NR当前行号
NF当前行列数
FS输入字段分隔符(默认空格/制表符)
OFS输出字段分隔符
选项说明
-F指定字段分隔符
-v传递外部变量

特殊代码块:

  • BEGIN { ... }:处理输入前执行(初始化、打印表头等)。
  • END { ... }:处理输入后执行(汇总统计、输出结果)。

示例:

# 打印列awk'{print $1}'file.txt# 第 1 列awk-F',''{print $2}'file.txt# 逗号分隔,第 2 列awk'{print $NF}'file.txt# 最后一列# 条件过滤awk'/error/ {print}'file.txt# 含 error 的行awk'$3 > 100 {print}'file.txt# 第 3 列数值 > 100awk'$1 == "root" {print}'/etc/passwd# 第 1 列等于 root# 统计awk'{sum += $2} END {print sum}'file.txt# 第 2 列求和awk'{count[$1]++} END {for (k in count) print k, count[k]}'file.txt# 按第 1 列计数# 格式化输出awk-F:'{print $1, $7}'/etc/passwd# 以冒号分隔,打印用户名和 shellawk'BEGIN{OFS="\t"} {print $1, $2}'file.txt# 输出以制表符分隔

6.4 组合使用

# 查日志中 ERROR 行,取第 3 列 IP,统计出现次数grep"ERROR"app.log|awk'{print $3}'|sort|uniq-c# 批量替换目录下所有配置文件中的旧域名find.-name"*.conf"|xargssed-i's/old.com/new.com/g'# 提取 nginx 日志访问最多的前 10 个 URLawk'{print $7}'access.log|sort|uniq-c|sort-rn|head-10# 过滤注释行后统计非空行grep-v'^#'config.txt|grep-v'^$'|wc-l

七、配套示例集合

# 创建目录并快速进入mkdir-p/home/ascend/ansiblecd!$# 返回上级目录cd..# 返回上次目录cd-# 合并输出并后台执行ansible-playbook site.yml>deploy.log2>&1&# 管道过滤后统计psaux|grepansible|wc-l# 条件执行test-d/home/ascend/ansible&&cd/home/ascend/ansible||mkdir-p/home/ascend/ansible# 文本处理组合grep-rn'error'/var/log/|awk-F:'{print $1}'|sort-used-i.bak's/old_value/new_value/g'/etc/app/config.ymlawk-F',''{sum += $3} END {print sum}'data.csv

参考资料

  1. GNU Bash Reference Manual, Section 3.6: Redirections.
  2. GNU Bash Reference Manual, Section 3.2.2: Pipelines.
  3. GNU Bash Reference Manual, Section 3.2.3: Lists of Commands.
  4. GNU Bash Reference Manual, Section 3.6.6: Here Documents / Here Strings.
  5. GNU Bash Reference Manual, Section 3.5.8: Process Substitution.
  6. GNU Bash Reference Manual, Section 9.3: History Interaction.
  7. readline(3) manual page.
  8. freedesktop.org, Clipboards Wiki.
  9. tmux User Manual, Copy Mode.
  10. GNU grep manual.
  11. GNU sed manual.
  12. GNU awk (gawk) manual.

返回列表