在linux上使用AWK编写文件

在linux上使用AWK编写文件,linux,bash,unix,awk,system-administration,Linux,Bash,Unix,Awk,System Administration,我有一个文件,它有几行,其中一行是 -xxxxxxxx()xxxxxxxx 我想将此行的内容添加到新文件中 我这样做: awk ' /^-/ {system("echo" $0 ">" "newline.txt")} ' 但这不起作用,它返回一个错误,该错误表示: Unnexpected token '(' 我相信这是由于()出现在队列中。如何克服此问题?您不需要系统,echo命令,只需: awk '/^-/ {print $1}' file > newfile 这将捕获以

我有一个文件,它有几行,其中一行是

-xxxxxxxx()xxxxxxxx
我想将此行的内容添加到新文件中

我这样做:

awk ' /^-/ {system("echo" $0 ">" "newline.txt")} '
但这不起作用,它返回一个错误,该错误表示:

Unnexpected token '(' 

我相信这是由于()出现在队列中。如何克服此问题?

您不需要
系统
echo
命令,只需:

awk '/^-/ {print $1}' file > newfile
这将捕获以
-
开头的行,如果有空格,则截断其余的行

awk '/^-/ {print $0}' file > newfile
将捕获整条线,包括空格

您还可以使用grep

grep -o '^-.*' file > newfile
捕获以
-

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

将更加具体,捕获以
-
开头的行,同时包含
()

您需要添加适当的空格

对于您的有害的
awk'/^-/{system(“echo“$0”>“newline.txt”)}
,shell命令本质上是
echo-xxxxxxxx()xxxxxxxx>newline.txt
,这肯定不起作用。您需要在
awk
字符串中构造一个正确的shell命令,并遵守
awk
s字符串连接规则,即您想要的脚本应该是这样的(由于结果shell命令中没有正确引用
$0
,因此该脚本仍然被破坏):

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

但是,如果您真的只需要将$0回送到文件中,您只需执行以下操作:

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

或者更简单

awk'/^-/'>newline.txt


它基本上将默认操作应用于所有匹配的记录,其中默认操作是打印当前记录,即此脚本仅过滤掉所需的记录。
>newline.txt
awk
之外重定向只需将其放入一个文件。

首先,为了从文件中简单提取模式,您不需要使用
awk
这是一种过度杀伤力,
grep
将足以完成以下任务:

输入:

$ more file
123
-xxxxxxxx()xxxxxxxx
abc
-xyxyxxux()xxuxxuxx
123
abc
123
$ grep -oE '^-[^(]+\(\).*' file                                                                                                  
-xxxxxxxx()xxxxxxxx
-xyxyxxux()xxuxxuxx
命令:

$ more file
123
-xxxxxxxx()xxxxxxxx
abc
-xyxyxxux()xxuxxuxx
123
abc
123
$ grep -oE '^-[^(]+\(\).*' file                                                                                                  
-xxxxxxxx()xxxxxxxx
-xyxyxxux()xxuxxuxx
解释:

$ more file
123
-xxxxxxxx()xxxxxxxx
abc
-xyxyxxux()xxuxxuxx
123
abc
123
$ grep -oE '^-[^(]+\(\).*' file                                                                                                  
-xxxxxxxx()xxxxxxxx
-xyxyxxux()xxuxxuxx
选项:
-oE
将输出定义为图案而不是整行(可以删除) 正则表达式:
^-[^(+]+\(\).
将选择以
-
开头并包含
()


通过在命令末尾添加
>new\u文件
,可以将输出重定向到
新的\u文件。

不清楚,请在帖子的问题中更加清楚。在帖子的代码标签
{}中添加输入示例和输出示例
按钮,然后让我们知道。我建议使用
print$0
来打印整行,而不是
print$1
,因为你永远不知道在
xxxx()xxxx
中是否有空格,而且
awk
对于这项任务来说可能是一种过度使用
grep
命令就足够了;-)@艾伦:OP应该表明字符串中有空格(编辑问题)。是的,我也打算建议grep,但这真的取决于他们。这不是我的问题哈哈哈,你永远不知道OP真正想要什么;-)很好的概括回答+1!:):)谢谢我的实际目标是将输出写入另一个目录中的文件。目录名由awk中的一个变量表示。因此,我使用了您的帮助并执行了以下操作:awk'/^-/{print$0>dirnamevaluate“/newline.txt”},但是我得到了一个错误:awk:无法打开“design/newline.txt”进行输出(没有这样的文件或目录),知道为什么吗?(design是变量dirNameVariable在awk中保持的值)您必须确保目录实际存在–相对于调用
awk
的当前目录,或者作为绝对路径表达式。当然,还需要写权限。不客气。您确实需要为
+
添加
-E
,或者在您的grep、idk中转义
+
就足够了。关键是,BRE中的
+
只是一个文字字符,而grep默认使用BRE,所以当您不需要
-P
时,您确实需要一些东西。。。