在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
时,您确实需要一些东西。。。