在 linux 上使用 AWK 编写文件

Write a file using AWK on linux

我有一个包含多行的文件,其中一行是

-xxxxxxxx()xxxxxxxx

我想把这一行的内容添加到一个新文件中

我这样做了:

awk ' /^-/ {system("echo" [=12=] ">" "newline.txt")} '

但这行不通,它 returns 一个错误:

Unnexpected token '(' 

我认为这是由于该行中存在 ()。如何克服这个问题?

您不需要 systemecho 命令,只需:

awk '/^-/ {print }' file > newfile

这将捕获以 - 开头的行,如果有 space 则截断其余行。

awk '/^-/ {print [=11=]}' file > newfile

将捕获整行,包括 spaces。

您也可以使用 grep

grep -o '^-.*' file > newfile

捕获任何以 -

开头的行
grep -o '^-.*().*' file > newfile

会更具体,并捕获以 - 开头也包含 ()

的行

您需要添加适当的空格![=2​​3=]

由于您的错误 awk ' /^-/ {system("echo" [=10=] ">" "newline.txt")} ',shell 命令本质上是 echo-xxxxxxxx()xxxxxxxx>newline.txt,这肯定是行不通的。您需要在 awk 字符串中构造一个正确的 shell 命令,并遵守 awk 的字符串连接规则,即您的预期脚本应该如下所示(仍然是错误的,因为 [= 14=] 在生成的 shell 命令中没有被正确引用):

awk '/^-/ { system("echo " [=15=] " > newline.txt") }'

然而,如果你真的只需要 echo [=16=] 到一个文件中,你可以简单地做:

awk '/^-/ { print [=17=] > "newline.txt" }'

或者更简单

awk '/^-/' > newline.txt

本质上将默认操作应用于所有匹配/^-/的记录,其中默认操作print, 是 neatly printing the current record 的缩写,即这个脚本只是过滤掉想要的记录。在 awk 之外的 > newline.txt 重定向只是将其放入文件中。

首先,对于从文件中简单提取模式,您不需要使用 awk 这是一个矫枉过正的问题,grep 足以完成任务:

输入:

$ more file
123
-xxxxxxxx()xxxxxxxx
abc
-xyxyxxux()xxuxxuxx
123
abc
123

命令:

$ grep -oE '^-[^(]+\(\).*' file                                                                                                  
-xxxxxxxx()xxxxxxxx
-xyxyxxux()xxuxxuxx

解释:

选项:-oE 将输出定义为模式而不是整行(可以删除) 正则表达式:^-[^(]+\(\).* 将 select 以 - 开头并包含 ()

的行

您可以通过在命令末尾添加 > new_file 将输出重定向到 new_file