如何在 Ubuntu 终端中使用 grep 从 txt 文件中获取特定单词

如何在 Ubuntu 终端中使用 grep 从 txt 文件中获取特定单词

我有一个txt文件。我想过滤该文件中的某个单词。

例子:

$PILOT_FIRSTNAME $PILOT_LASTNAME. This is the final confirmation for this flight.

我想要如下输出:

PILOT_FIRSTNAME

PILOT_LASTNAME

所有带有 的单词都有哪些$,该单词仅用于提取?

答案1

使用 grep 的 PCRE(perl 兼容正则表达式)模式:

$ grep -Po '\$\K\w*' yourfile
PILOT_FIRSTNAME
PILOT_LASTNAME
  • \$:匹配文字$
  • \K: (忽略它)
  • \w: 后跟零个或多个单词字符

如果你想匹配并保留文字$字符,那么你就不需要修饰符\K了——事实上你根本不需要 PCRE,你可以简单地使用

$ grep -o '\$\w*' yourfile
$PILOT_FIRSTNAME
$PILOT_LASTNAME

或者(可能更便携)

grep -o '\$[_[:alnum:]]*' yourfile
$PILOT_FIRSTNAME
$PILOT_LASTNAME

答案2

因此,如果您想以换行符分隔的文件字段(如果以 开头)$,您可以执行以下操作:

awk '{for(i=1;i<=NF;i++){if($i~/^\$/){printf "%s\n",substr($i,2)}}}' file.txt

展开形式:

awk '{
    for (i=1;i<=NF;i++)
        { if($i~/^\$/)
                { printf "%s\n",substr($i,2) }
        }
     }' file.txt

这里我们对字段进行迭代(for (i=1;i<=NF;i++)),如果字段以$if($i~/^\$/))开头,则从第二个字符()开始打印尾随换行符printf "%s\n",substr($i,2)


另一方面,如果字段数量固定且不是很多,那么sed也是一个可行的选择,这里假设两个字段:

sed -nr 's/^\$([^[:blank:]]+)[[:blank:]]+\$([^[:blank:]]+)$/\1\n\2/p' file.txt

$在每个空格分隔的字段的开头进行匹配,捕获该字段( ([^[:blank:]]+)),然后在替换中将字段设置为换行符分隔(1\n\2)。


例子:

$ cat file.txt
$PILOT_FIRSTNAME $PILOT_LASTNAME
$FOO $BAR
PILOT_FOO PILOT_BAR

$ awk '{for(i=1;i<=NF;i++){if($i~/^\$/){printf "%s\n",substr($i,2)}}}' file.txt
PILOT_FIRSTNAME
PILOT_LASTNAME
FOO
BAR

$ sed -nr 's/^\$([^[:blank:]]+)[[:blank:]]+\$([^[:blank:]]+)$/\1\n\2/p' file.txt
PILOT_FIRSTNAME
PILOT_LASTNAME
FOO
BAR

相关内容