2013-01-19 172 views
0

我都行说打印n字符

jan 02:12:00 YRU QRS : ASP.net Bird 
feb 02:12:00 YRU QRS : ASP.net Dog 

我想一个脚本来有模式搜索的ASP.NET和打印从它的10个字符中的每一行,所以这将涉及BirdDog

感谢

+2

欢迎的StackOverflow!您可以通过发布您尝试的代码示例以及他们生成的输出来改进您的问题。StackOverflow是关于帮助人们,但这不是为他们做的。请阅读[常见问题](http://stackoverflow.com/faq)。 – kojiro

回答

3

一个使用perl方式:

perl -ne 'm/asp\.net\s+(.{0,10})/i && print "$1\n"' infile 

这产生了:

Bird 
Dog 

EDIT解释perl单行的语法:

m/.../i尝试匹配与整个线路正则表达式。 i标志忽略该情况。正则表达式是文字asp.net加上空格加上任意数量的0到10之间的字符以贪婪的方式。如果成功执行下面的指令来打印哪些parens匹配。

+0

真棒比雷,谢谢,请你带我穿过语法。它会帮助我的世界。 –

+0

@aravindhanSelvan:我已经更新了解释它的答案。 – Birei

1

GNU和BSD里grep有一个很好的扩展--only-matching,或-o,将只输出线的一部分,你符合其中:

grep -Eio 'asp\.net.{0,10}' <<< 'jan 02:12:00 YRU QRS : ASP.net Bird 
feb 02:12:00 YRU QRS : ASP.net Dog' 
ASP.net Bird 
ASP.net Dog 

Bash可以用它的正则表达式的功能做到这一点,但它可能会更好,如果你打开不区分大小写匹配第一:

shopt -s nocasematch 
while read; do 
    if [[ $REPLY =~ asp\.net(.{0,10}) ]]; then 
     echo "${BASH_REMATCH[1]}" 
    fi 
done <<< 'jan 02:12:00 YRU QRS : ASP.net Bird 
feb 02:12:00 YRU QRS : ASP.net Dog' 
Bird 
Dog 
3
perl -lne 'print $1 if /ASP.net (.{0,10})/' 
+1

如果你解释了'-l'选项,这会更好(这是一件不寻常的事情)。 –

+1

@JonathanLeffler:我认为'-l'远不是不同寻常的,尽管我确实认为这个解决方案简单到无礼。 – Borodin

+0

@Borodin:我认为不寻常是在旁观者的眼中;我从来没有使用过我能记得的'-l',并且必须查看它以了解它的作用(尽管它有时可能有用,如果我能记得使用它),并且我只用Perl编程大约二十年了。然而,Perl有很多子方言,除了它是一种大型语言/程序,并不是所有人都使用的大型语言/程序之外,它可能并不代表任何东西。 –

0

AWK单行:

awk -F'ASP\\.net' '{print substr($2,0,10)}' file 

注意,这将打印10个字符立即ASP.net后,这意味着,从space开始。如果你不想要的空间,使用下面的一行:

awk -F'ASP\\.net ' '{print substr($2,0,10)}' file 
0

假设你有一个文件中的文本“input.txt中”下面的一行将做的工作:

cat input.txt | awk '/ASP\.net/ {print substr($0, index($0,"ASP.net") + length("ASP.net"), 10)}' 

说明:

  • 对包含文本 “ASP.net”
  • 打印10个字符的行
  • ST “ASP.net” 的位置之后arting
+4

不需要[UUOC](http://catb.org/jargon/html/U/UUOC.html):'awk'可以直接将文件名作为参数。 (如果它不能,你可以做' kojiro

0

这可能为你工作(GNU SED):

sed -nr '/.*ASP\.net(.{,10}).*/s//\1/p' file