我在文件中寻找一些字符串,我需要使用UNIX命令确切位置(行号和行中的位置)。
我只能使用 grep -n 找到行号,但我无法获得外观数量甚至是他们的位置。
我知道如何使用 gregexpr 函数在R中编写脚本来完成所有这些操作,但我只想使用UNIX命令。它有一些等价物吗?
答案 0 :(得分:2)
要获取行上的行号和模式的所有位置,您可以使用此awk命令:
cat file
#This is your hosts file
127.0.0.1 localhost linux
192.168.1.2 domain1.com
#this is added automatically to
192.168.1.2 sub.domain1.com www.domain1.com
awk -v p='domain1' 'index($0,p) {
printf "%s:", NR;
s=$0; m=0;
while((n=index(s, p))>0) {
m+=n;
printf "%s ", m;
s=substr(s, n+1)
}
print ""
}' file
3:13
5:17 33
以下替代awk命令也应该起作用:
awk -v p='domain1' 'index($0,p) {
printf "%s:", NR;
l=length(p);
s=$0;
m=0;
while((n=index(s, p))>0) {
m = m ? m+n+l-1 : m+n;
printf "%s ", m;
s=substr(s, n+l)
}
print ""
}' file
3:13
5:17 33
答案 1 :(得分:2)
$ cat file
now is
the winter of our
discontent
$ awk 's=index($0,"winter") { print "line=" NR, "start position=" s}' file
line=2 start position=5
如果您想查找所有出现的字符串:
$ cat file
now is
the winter (yes, winter) of our
discontent
$ cat tst.awk
BEGIN{ SLENGTH = length(string) }
{
skipped = 0
starts = ""
while ( SSTART = index($0,string) ) {
starts = starts (starts?" ":"") (skipped + SSTART)
$0 = substr($0,SSTART + SLENGTH)
skipped += (SSTART + SLENGTH - 1)
}
}
starts { print "line=" NR, "start position(s)=" starts }
$ awk -v string="winter" -f tst.awk file
line=2 start position(s)=5 18
我通常不会主张使用全大写变量名,因为那些通常表示内置变量,但在这种情况下我想清楚地显示index()与字符串之间的等价性(用户提供的SSTART / SLENGTH)和regexps的match()(内置RSTART / RLENGTH)。
恕我直言SSTART / SLENGTH应该已经内置到index()函数中,但是我理解为什么它们不是(功能上不必要,不像RLENGTH for match(),所以不必要的性能影响)我怀疑是否会发生在这一点所以它是nbd。这是一个定义和使用index()函数(名称sidx()
)的版本,如果有人关心/喜欢这样做:
$ cat tst.awk
function sidx(src,tgt) {
SLENGTH = ( (SSTART=index(src,tgt)) ? length(tgt) : 0 )
return SSTART
}
{
skipped = 0
starts = ""
while ( sidx($0,string) ) {
starts = starts (starts?" ":"") skipped + SSTART
$0 = substr($0,SSTART + SLENGTH)
skipped += SSTART + SLENGTH - 1
}
}
starts { print "line=" NR, "start position(s)=" starts }
$
$ awk -v string="winter" -f tst.awk file
line=2 start position(s)=5 18
警告:如果您将空字符串作为要搜索的字符串传入,则上述脚本将进入无限循环。如果您愿意,可以在BEGIN部分为此添加测试。
如果您想要不同的内容,请使用一些示例输入和预期输出更新您的问题,并阐明您的要求。
答案 2 :(得分:1)
您可以在以下行中找到确切的位置:
回声" Unix论坛是最好的网站。" | grep -o" [-_ a-zA-Z0-9。]" | grep -n x4:X
我在这里找到:http://www.unix.com/shell-programming-scripting/26190-finding-character-position-file.html
您可以将其与您的解决方案结合使用。
(呃。它只适用于角色......)