在 linux 上使用 AWK 编写文件
Write a file using AWK on linux
我有一个包含多行的文件,其中一行是
-xxxxxxxx()xxxxxxxx
我想把这一行的内容添加到一个新文件中
我这样做了:
awk ' /^-/ {system("echo" [=12=] ">" "newline.txt")} '
但这行不通,它 returns 一个错误:
Unnexpected token '('
我认为这是由于该行中存在 ()。如何克服这个问题?
您不需要 system
、echo
命令,只需:
awk '/^-/ {print }' file > newfile
这将捕获以 -
开头的行,如果有 space 则截断其余行。
awk '/^-/ {print [=11=]}' file > newfile
将捕获整行,包括 spaces。
您也可以使用 grep:
grep -o '^-.*' file > newfile
捕获任何以 -
开头的行
grep -o '^-.*().*' file > newfile
会更具体,并捕获以 -
开头也包含 ()
的行
您需要添加适当的空格![=23=]
由于您的错误 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
。
我有一个包含多行的文件,其中一行是
-xxxxxxxx()xxxxxxxx
我想把这一行的内容添加到一个新文件中
我这样做了:
awk ' /^-/ {system("echo" [=12=] ">" "newline.txt")} '
但这行不通,它 returns 一个错误:
Unnexpected token '('
我认为这是由于该行中存在 ()。如何克服这个问题?
您不需要 system
、echo
命令,只需:
awk '/^-/ {print }' file > newfile
这将捕获以 -
开头的行,如果有 space 则截断其余行。
awk '/^-/ {print [=11=]}' file > newfile
将捕获整行,包括 spaces。
您也可以使用 grep:
grep -o '^-.*' file > newfile
捕获任何以 -
grep -o '^-.*().*' file > newfile
会更具体,并捕获以 -
开头也包含 ()
您需要添加适当的空格![=23=]
由于您的错误 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
。