如何在bash中提取字符串的最后一部分?

use*_*818 28 string bash awk

我有变量:

A="Some variable has value abc.123"
Run Code Online (Sandbox Code Playgroud)

我需要提取这个值,即abc.123.在bash中这可能吗?

gam*_*may 80

最简单的是

echo $A | awk '{print $NF}'
Run Code Online (Sandbox Code Playgroud)

编辑:解释这是如何工作的......

awk默认情况下,使用空格作为分隔符,将输入分成不同的字段.硬编码5代替NF输入中第5个字段的打印:

echo $A | awk '{print $5}'
Run Code Online (Sandbox Code Playgroud)

NF是一个内置awk变量,它给出当前记录中的字段总数.以下返回数字5,因为字符串中有5个字段"Some variable has value abc.123":

echo $A | awk '{print NF}'
Run Code Online (Sandbox Code Playgroud)

结合$NF输出字符串中的最后一个字段,不管你的字符串有多少个字段包含的内容.

  • 这是命令行的最佳答案,我想知道为什么它不是更受欢迎 (3认同)
  • "print NF" 打印单词数,$NF 是最后一个单词。 (3认同)

rua*_*akh 37

是; 这个:

A="Some variable has value abc.123"
echo "${A##* }"
Run Code Online (Sandbox Code Playgroud)

将打印此:

abc.123

(符号Bash参考手册的 §3.5.3"Shell参数扩展"中进行了解释.)${parameter##word}


koo*_*ola 11

一些使用参数扩展的示例

A="Some variable has value abc.123"
echo "${A##* }"

abc.123
Run Code Online (Sandbox Code Playgroud)

""空间最长的匹配

echo "${A% *}"

Some variable has value
Run Code Online (Sandbox Code Playgroud)

最长的比赛.点

echo "${A%.*}"

Some variable has value abc
Run Code Online (Sandbox Code Playgroud)

""空间最短匹配

echo "${A%% *}"

some
Run Code Online (Sandbox Code Playgroud)

阅读更多Shell-Parameter-Expansion


unw*_*ind 9

你怎么知道价值从哪里开始?如果它始终是第5和第6个单词,您可以使用例如:

B=$(echo $A | cut -d ' ' -f 5-)
Run Code Online (Sandbox Code Playgroud)

这使用cut命令切出部分行,使用简单空格作为单词分隔符.


mwf*_*ley 7

文档是有点痛苦的阅读,所以我在一个简单的方法概括它。

请注意, ' *' 需要与 ' '交换位置,具体取决于您使用#%。(这*只是一个通配符,因此您可能需要在阅读时摘下“正则表达式帽子”。)

  • ${A% *}- 删除最短尾随 *(去掉最后一个字
  • ${A%% *}- 删除最长的尾随 *(去掉最后的话
  • ${A#* }- 删除最短的前导* (去掉第一个单词
  • ${A##* }- 删除最长的前导* (去掉第一个单词

当然,这里的“单词”可能包含任何不是文字空间的字符。

您可能通常使用此语法来修剪文件名:

  • ${A##*/}删除所有包含的文件夹(例如/usr/bin/git-> git
  • ${A%.*}删除最后一个扩展名(例如archive.tar.gz-> archive.tar) - 只是要警惕这样的事情my.path/noext


Neb*_*tic 5

正如 Zedfoxus在这里指出的那样。一种非常干净的方法,适用于所有基于 Unix 的系统。此外,您不需要知道子字符串的确切位置。

A="Some variable has value abc.123"

echo "$A" | rev | cut -d ' ' -f 1 | rev                                                                                            

# abc.123
Run Code Online (Sandbox Code Playgroud)