获取字符串在file-UNIX命令行中的确切位置

获取字符串在file-UNIX命令行中的确切位置,unix,awk,grep,Unix,Awk,Grep,我正在文件中查找一些字符串,我需要使用UNIX命令确定它们的确切位置(行号和行中的位置) 我只能使用grep-n查找行号,但我无法获得外观的数量甚至它们的位置 我知道如何使用gregexpr函数在R中编写脚本来完成这一切,但我只想使用UNIX命令。它有什么等价物吗?你可以在这样一行中找到确切的位置: echo“Unix论坛是最好的网站。”| grep-o“[-_a-zA-Z0-9.]”grep-nx 4:x 我在这里发现: 您可以将其与您的解决方案相结合 (Ehh.它只适用于字符…)您可以在这样

我正在文件中查找一些字符串,我需要使用UNIX命令确定它们的确切位置(行号和行中的位置)

我只能使用grep-n查找行号,但我无法获得外观的数量甚至它们的位置


我知道如何使用gregexpr函数在R中编写脚本来完成这一切,但我只想使用UNIX命令。它有什么等价物吗?

你可以在这样一行中找到确切的位置:

echo“Unix论坛是最好的网站。”| grep-o“[-_a-zA-Z0-9.]”grep-nx

4:x

我在这里发现:

您可以将其与您的解决方案相结合


(Ehh.它只适用于字符…)

您可以在这样一行中找到确切的位置:

echo“Unix论坛是最好的网站。”| grep-o“[-_a-zA-Z0-9.]”grep-nx

4:x

我在这里发现:

您可以将其与您的解决方案相结合


(Ehh.它仅适用于字符…

要获取行号和一行上图案的所有位置,可以使用此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命令也应起作用:

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 

要获取线号和线上图案的所有位置,可以使用以下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命令也应起作用:

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 
如果要查找字符串的所有匹配项:

$ 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()与regexp的match()之间的等价性(内置RSTART/RLENGTH)

IMHO SSTART/SLENGTH应该内置到index()函数中,但我理解为什么它们没有内置(功能上不必要,不像RLENGTH for match(),因此对性能有不必要的影响),我怀疑这是否会在此时发生,所以这是nbd。下面是一个定义并使用index()函数(names
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
警告:如果传入一个空字符串作为要搜索的字符串,则上述脚本将进入无限循环。如果您愿意,可以在“开始”部分添加测试

如果您想要一些不同的东西,请使用一些示例输入和预期输出更新您的问题,并澄清您的需求

如果要查找字符串的所有匹配项:

$ 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()与regexp的match()之间的等价性(内置RSTART/RLENGTH)

IMHO SSTART/SLENGTH应该内置到index()函数中,但我理解为什么它们没有内置(功能上不必要,不像RLENGTH for match(),因此对性能有不必要的影响),我怀疑这是否会在此时发生,所以这是nbd。下面是一个定义并使用index()函数(names
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
警告:如果传入一个空字符串作为要搜索的字符串,则上述脚本将进入无限循环。如果您愿意,可以在“开始”部分添加测试


如果您想要一些不同的东西,请使用一些示例输入和预期输出更新您的问题,并澄清您的要求。

不要假设阅读本文的人对
gregexpr
有任何线索。明确地告诉我们你想要什么,而不是说你想要一个我们从未听说过的解决方案。另外,发布一些示例输入和预期输出。不要假设阅读本文的人知道什么是
gregexpr
。明确地告诉我们你想要什么,而不是说你想要一个我们从未听说过的解决方案。另外,发布一些示例输入和预期输出。通过
echo“Unix论坛是最好的站点”,该功能可以更简单、可靠和高效地实现。|awk'{print index($0,x”)}
,它也适用于任何字符串,而不仅仅是某些字符。原来Unix论坛可能不是最好的站点:-)。通过
echo“Unix论坛是最好的站点”,可以更简单、更可靠、更高效地实现该功能。|awk'{print index($0,x”)}
,它也适用于任何字符串,而不仅仅是某些字符。原来Unix论坛可能不是最好的站点:-)。@EdMorton:我提供了一个更好的示例,并重新格式化了awk命令,使其更加详细。通过这个awk,我试图列出
行:
,后面是该行上图案的所有起始位置。我不确定OP是否真的需要这么多信息。我不知道,我只是注意到你的脚本格式很难阅读,你在介绍行中说
使用grep
,然后不使用grep。我不确定我是否完全理解您的脚本(它看起来比我预期的要长,但这可能是必要的,idk),但一看您应该将
$0~p
更改为
索引($0,p)
。非常感谢@EdMorton。是的,grep是一个愚蠢的打字错误,我用
索引($0,p)
替换了
$0~p
,并通过删除数组缩短了脚本。你启发我写了一个做同样事情的脚本。我们的方法之间有一些有趣的区别,最值得注意的是,您将字符串向前推进超过匹配单词的第一个字符,而我将其向前推进超过整个匹配单词。我想知道这是否会导致功能上的差异。我需要考虑一下!再加上一点逻辑,我就可以让它按针的长度前进。请参见编辑。@EdMorton:我提供了一个更好的示例,并重新格式化了awk命令,使其更加详细。通过这个awk,我试图列出
line:
,后面是模式o的所有起始位置