在Linux上使用AWK编写文件

3
我有一个文件,其中有几行,其中一行是:
-xxxxxxxx()xxxxxxxx

我希望将这行内容添加到一个新文件中。

我做了以下操作:

awk ' /^-/ {system("echo" $0 ">" "newline.txt")} '

但这并不起作用,它返回一个错误,说:
Unnexpected token '(' 

我认为这是由于该行中的()引起的。如何解决这个问题?

请更清晰地阐述您的问题。在您的帖子中添加输入和输出示例,并使用CODE标签{}按钮将它们显示出来,然后让我们知道即可。 - RavinderSingh13
3个回答

3

您需要添加适当的空格!

在您错误的awk ' /^-/ {system("echo" $0 ">" "newline.txt")} '中,shell命令实际上是echo-xxxxxxxx()xxxxxxxx>newline.txt,这显然行不通。您需要在awk字符串内构建正确的shell命令,并遵守awk的字符串连接规则,即您想要的脚本应该像这样(仍然有缺陷,因为$0在生成的shell命令中没有被正确引用):

awk '/^-/ { system("echo " $0 " > newline.txt") }'

但是,如果您只需要将echo $0写入文件,则可以简单地执行以下操作:

awk '/^-/ { print $0 > "newline.txt" }'

甚至更简单:

awk '/^-/' > newline.txt

这基本上将默认操作应用于所有匹配/^-/的记录,其中默认操作print,即将当前记录清晰地打印出来,即此脚本仅过滤所需的记录。 > newline.txt重定向在awk之外,只是将其放入文件中。


谢谢。我的实际目的是将输出写入到不同目录下的文件中。目录名由awk中的一个变量表示。 所以我使用了您的帮助,做了这个:awk '/^-/ {print $0 > dirNameVariable"/newline.txt"}'但是我收到了一个错误消息:awk: 无法打开 "design/newline.txt" 进行输出(没有那个文件或目录)有什么想法吗?(design是awk中dirNameVariable变量的值) - Deeraj Theepshi
你必须确保目录实际存在 - 要么相对于从中调用awk的当前目录,要么作为绝对路径表达式。当然,还需要写入权限。 - Robin479

2
你不需要使用 systemecho 命令,只需简单地:
awk '/^-/ {print $1}' file > newfile

这将捕获以 - 开头的行,并在出现空格时截断其余部分。
awk '/^-/ {print $0}' file > newfile

可以使用包括空格在内的整行进行捕获。

您也可以使用 grep 命令:

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

捕获任何以-开头的行。
grep -o '^-.*().*' file > newfile

需要更具体,捕获以 - 开头并包含 () 的行。


1
我建议使用print $0来打印整行,而不是使用print $1,因为你永远不知道xxxx()xxxx中是否有空格。此外,对于这个任务,awk可能过于复杂了,使用grep命令就足够了;-) - Allan
@Allan:OP应该指出该字符串中有空格(编辑问题)。是的,我也打算建议使用grep,但这真的取决于他们。 - l'L'l
这不是我的问题,哈哈哈,你永远不知道OP 真正想要什么;-) - Allan
1
很好的总结回答 +1! :) :) - Allan

2

首先,如果只是从文件中简单提取模式,您不需要使用awk,这会过度杀伤,grep就足够了:

输入:

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

命令:

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

解释:

选项: -oE 可以定义输出为模式而不是整行(可省略) 正则表达式: ^-[^(]+\(\).* 将选择以 - 开头且包含 () 的行。

您可以通过在命令的结尾添加 > new_file 将输出重定向到一个名为 new_file 的新文件中。


1
不用谢。但是你需要为 + 添加 -E,或者在 grep 中转义 + 就足够了,我不确定。重点是,在 BRE 中,+ 只是一个字面字符,并且 grep 默认使用 BRE,因此虽然你不需要 -P,但你确实需要一些东西... - Ed Morton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接