我有一个纯文本文件,看起来像
*,cli-verify-aggregation-general,./link-aggr/aggregation.xls
-,stress-verify-aggregation-max-amount-of-lag-group,./link-aggr/aggregation.xls
我需要另一个文件,其中仅包含以“-”开头的行
输出文件:
stress-verify-aggregation-max-amount-of-lag-group,./link-aggr/aggregation.xls
它不应该有“-”
答案1
有几种可能的方法可以实现您想要的目标。假设您的输入文件被调用input.txt
并且您的输出 - 想象一下 - output.txt
,以下内容应该有效:
1. 使用awk
和的方法cut
awk '/^-/' input.txt | cut -d "," -f 2- > output.txt
这指示awk
匹配input.txt
以 a 开头的每一行-
,并将匹配行(这是默认操作,因此不需要显式指定)打印到标准输出。
这通过管道作为输入到cut
,它以每个逗号 ( ) 分隔行-d ","
并打印如此标识的所有字段,但从第二( ),从而省略您想要删除的-f 2-
前导。-
然后输出被重定向到一个文件。
您可以在以下位置找到更多信息GNU Awk 用户指南如果你感兴趣。
2. 使用grep
和的方法cut
在这个相当“简单”的设置中,您也可以使用grep
awk 来代替,具有类似的效果:
grep "^-" input.txt | cut -d "," -f 2- > output.txt
要使用的正则表达式是相同的:匹配 a -
,但前提是它出现为该行的第一个字符(这就是前面的含义^
)。
3. 使用方法sed
最后,你还可以使用sed
来实现这一点
sed -e "/^[^-]/d" -e "s/^-,//" input.txt > output.txt
这指示使用两个规则sed
进行处理。input.txt
- 首先,从输入中删除所有文件不是以 a
-
开头:第一个^
仍然意味着以下内容必须作为该行的第一个字符出现,但在表达式中[ ... ]
它意味着“除了a-
"。如果找到这样的行,它将被删除(不用担心,sed
除非您指定该选项,否则不会触及您的输入文件-i
)。 - 其次,在所有输入行中,将 (
s/.../.../
)前导替换-,
为 ... 空(因此将其删除)。
输出再次重定向到文件。
正如@Sundeep 所指出的,这也可以通过声明变成一个更紧凑的单一规则
sed -n 's/^-,//p' input.txt > output.txt
它指示sed
删除所有像这样开始的行中的前导-,
,并打印(仅)匹配的行(尾随p
),再次将输出重定向到文件。笔记该选项-n
在这里很重要,可以抑制所谓的输出模式空间这会干扰你想要实现的目标。