awk - 颜色多线模式(像grep)?

时间:2016-05-19 02:38:57

标签: linux shell unix awk grep

是否可以使用awk以与使用grep相同的方式突出显示搜索短语?

给出以下文件

  

>基因

     

AAATTTGCAGAGATTACAGGGGGGG

这个grep命令$ grep --color=auto GATTACA file.txt 产生

  

AAATTTGCAGA的 GATTACA GGGGGGG

粗体是彩色文字。

因为我实际使用的文件的模式跨越多行,所以我使用的是awk而不是grep。所以文件看起来像这样:

  

>基因

     

AAATTTGCAGAGAT

     

TACAGGGGGGG

我可以使用以下awk代码用我的短语

打印记录
awk 'BEGIN{RS=">"; FS="\n";}/GATTACA/{print$0}' file.txt

返回

  

基因

     

AAATTTGCAGAGATTACAGGGGGGG

但我希望我的模式是一种颜色(如grep cmd):

  

基因

     

AAATTTGCAGA的 GATTACA GGGGGGG

任何帮助都会非常感激,因为我还是unix和awk的新手。此问题与How to print awk's results with different colors for different fields?不重复。这个问题的不同之处在于它要求为搜索词而不是整个字段着色。从技术上讲,我打印整个字段{print$0},我的整个返回结果会改变颜色。

awk 'BEGIN{RS=">"; FS="\n";}/GATTACA/{print "\033[0;32m"$0"\033[0m"}' file.txt

返回

  

基因

     

AAATTTGCAGAGATTACAGGGGGGG

我也试过这个:

awk 'BEGIN{RS=">"; FS="\n";}"\033[0;32m"/GATTACA/"\033[0m"{print$0}' file.txt

只返回错误:

  

awk:(FILENAME = nametest.txt FNR = 1)致命:尝试除零

我只是不确定如何将颜色代码合并到搜索字词中。可能是我的awk代码需要完全重新格式化。请告诉我!再次感谢!

1 个答案:

答案 0 :(得分:0)

Lars Fischer在comment中回答了这个问题。这个社区wiki帖子正式化(并改进)它。

要仅对搜索字词进行着色,您可以对这些颜色代码使用全局替换(gsub):

awk 'BEGIN { RS=">"; FS="\n" } gsub(/GATTACA/, "\033[0;32m&\033[0m", $0)' file

这会将记录分隔符(RS)设置为>而不是默认\n(换行符),将字段分隔符(FS)设置为{{1}而不是其他空白字符的默认值。然后,它对该查询执行全局替换,将文本替换为正确颜色代码所包围的文本。

\n返回它所做的替换次数,默认情况下没有命令的子句被打印,所以这段代码运行替换作为子句,因此gsub打印当且仅当有替换时。 (awk完成其工作,当没有替换时返回零(false),当有替换时返回非零(true)。)