Linux文本处理问询:字符串截取及文件字段片段提取并存变量
解决方案
需求1:搜索指定字符串并截取目标单词存入变量
针对这类需求,根据目标单词的位置或匹配规则,有两种常用实现方式:
按字段截取:如果目标单词是匹配行的固定字段(比如第3个字段),可以结合
grep和awk直接提取:# 示例:搜索包含"target_keyword"的行,提取第3个字段存入变量 target_var=$(grep "target_keyword" your_file.txt | awk '{print $3}')按正则匹配截取:如果目标单词符合特定正则模式(比如以
start_开头、以_end结尾),可以用grep -o只输出匹配的片段:# 示例:提取所有符合"start_.*_end"模式的内容存入变量 target_var=$(grep -o "start_.*_end" your_file.txt)
需求2:提取路径中从expdp到.dmp的片段存入变量
你已经通过命令拿到了完整路径,这里提供两种简洁的处理方式:
方法1:一步到位(合并提取路径和截取操作)
无需先单独存FULL_DMP_NAME,直接用awk完成匹配和截取:
FULL_DMP_NAME=$(awk '/\/orabackup/ {match($2, /expdp.*\.dmp/); print substr($2, RSTART, RLENGTH)}' "$REFLIST_OP")
解释:
match($2, /expdp.*\.dmp/):在第2个字段中匹配从expdp开始到.dmp结束的内容(注意.需要转义为\.)substr($2, RSTART, RLENGTH):提取匹配到的子串,RSTART是匹配起始位置,RLENGTH是匹配长度
方法2:对已有的FULL_DMP_NAME变量处理
如果已经拿到了完整路径变量,可用以下两种方式:
用sed处理:
FULL_DMP_NAME=$(echo "$FULL_DMP_NAME" | sed 's/.*\(expdp.*\.dmp\)/\1/')解释:
.*匹配expdp之前的所有路径内容,\(expdp.*\.dmp\)捕获目标片段,\1输出捕获的结果。用Bash参数展开(无需外部命令):
# 先删除expdp之前的所有内容,再补回expdp前缀 temp="${FULL_DMP_NAME##*/expdp}" FULL_DMP_NAME="expdp$temp"测试示例路径
/data/abc/GOon/expdp_TEST_P119_*_18112017.dmp,处理后会得到期望的expdp_TEST_P119_*_18112017.dmp。
内容的提问来源于stack exchange,提问作者Abhinav
相关产品推荐
相关产品推荐

