如何解析命令行变量?如何用Bash脚本提取文本指定内容?
我来帮你解决这两个命令行相关的问题,都是日常Shell操作里很实用的技巧:
1. 命令行中解析变量的常见方式
在Bash(或类Unix Shell)环境下,变量解析是基础操作,不同场景有不同的用法:
- 基础变量引用:用
$变量名或${变量名}来解析变量,后者在变量名和后续字符连在一起时必须使用,避免混淆:username="John" echo "Welcome, $username" # 输出 Welcome, John echo "Welcome, ${username}Doe" # 输出 Welcome, JohnDoe(不用{}的话会解析$usernameDoe,大概率为空) - 引号对变量解析的影响:双引号会解析变量内容,单引号会原样输出变量名,这点一定要注意:
echo 'Hello, $username' # 输出 Hello, $username echo "Hello, $username" # 输出 Hello, John - 命令行参数变量:如果是写Shell脚本,
$1、$2对应脚本接收的第一个、第二个参数,$@代表所有传入的参数:# 比如脚本名为greet.sh echo "你传入的第一个参数是:$1" echo "所有参数列表:$@" # 运行 ./greet.sh Alice Bob 的输出: # 你传入的第一个参数是:Alice # 所有参数列表:Alice Bob - 特殊内置变量:Shell还有一些内置的特殊变量,比如
$?是上一条命令的执行状态码(0表示成功),$$是当前进程ID,直接引用就能解析它们的值。
2. 使用Bash命令行处理文本文件(跳过前14行和最后2行)
确实不用写Java/Python脚本,用Shell自带的工具就能快速搞定,这里给你三种实用方法,按需选择:
方法1:结合head和tail(直观易懂)
先计算文件的总行数,再通过tail跳过前14行,head截取掉最后2行:
total_lines=$(wc -l < input.txt) tail -n +15 input.txt | head -n $((total_lines - 14 - 2)) > output.txt
解释:tail -n +15表示从第15行开始输出(跳过前14行),$((total_lines - 16))计算出需要保留的行数(总行数减去前14行和后2行),最后用>把结果写入新文件output.txt。
方法2:用sed命令(简洁)
如果你的系统sed版本支持行号偏移,可以直接用一行命令搞定:
sed '1,14d; $-1,$d' input.txt > output.txt
解释:1,14d删除前14行,$-1,$d删除倒数第1行和倒数第2行。如果某些sed版本不支持$-1,可以拆成两步:
sed '1,14d' input.txt | sed '$d' | sed '$d' > output.txt
先删前14行,再连续删两次最后一行,效果一样。
方法3:用awk(最通用,适合大文件)
awk处理文本更灵活,尤其是大文件时可以不用加载全部内容到内存:
awk '{ if (NR > 14) { # 保存最近两行,输出更前面的一行 print prev_line prev_line = current_line current_line = $0 } } END { # 最后输出倒数第三行 print prev_line }' input.txt > output.txt
这个方法只保留最近的两行内容,当行数超过14后,每次输出前一行,最后在结束时输出倒数第三行,自动跳过了最后2行,内存占用极低,适合处理超大文件。
内容的提问来源于stack exchange,提问作者user9524761
相关产品推荐
相关产品推荐

