![sed / awk / grep 查找分号之间的字符串](https://linux22.com/image/93953/sed%20%2F%20awk%20%2F%20grep%20%E6%9F%A5%E6%89%BE%E5%88%86%E5%8F%B7%E4%B9%8B%E9%97%B4%E7%9A%84%E5%AD%97%E7%AC%A6%E4%B8%B2.png)
我有一个巨大的文本文件,其中包含类似的内容:
igflex01; igflexdev01; igdbstg01;
igldapint01; igjetdev01; igsql01;
igesxstg01; igdbint01; igdmstg01;
igdsdev01; igdmmmo01; igmsgint02;
等等...
当字符串“int”存在时,我想提取分号之间的所有文本。有没有办法做到这一点?
答案1
由于您要求 sed / grep,所以它是:
> cat file
igflex01; igflexdev01; igdbstg01;
igldapint01; igjetdev01; igsql01;
igesxstg01; igdbint01; igdmstg01;
igdsdev01; igdmmmo01; igmsgint02;
> sed -nr 's/\s*;\s*/\n/gp' file | grep int
igldapint01
igdbint01
igmsgint02
或者仅通过一次 sed 调用即可获得它......
> sed -nr -e 's/\s*;\s*/\n/g;/int/P' file
igldapint01
igdbint01
igmsgint02
答案2
使用“tr”命令将分号替换为换行符,然后运行 grep (面向行)。
$ cat input.txt | tr ';' '\n' | grep int
igldapint01
igdbint01
igmsgint02
答案3
一种方法是作弊并将其转换;
为换行符,然后你可以只 grep 例如
tr ';' '\012' | grep int
例如
$ cat x
igflex01; igflexdev01; igdbstg01;
igldapint01; igjetdev01; igsql01;
igesxstg01; igdbint01; igdmstg01;
igdsdev01; igdmmmo01; igmsgint02;
$ cat x | tr ';' '\012' | grep int
igldapint01
igdbint01
igmsgint02
请注意,在某些情况下它有空格,因为空格是在;
s 之间。另请注意,一行的第一个单词(不是严格地之间;
在一条线上,但在数据中位于它们之间)也被返回。
答案4
$ cat abc.txt
igflex01; igflexdev01; igdbstg01;
igldapint01; igjetdev01; igsql01;
igesxstg01; igdbint01; igdmstg01;
igdsdev01; igdmmmo01; igmsgint02;
$ grep -o '[^;]*int[^;]*' abc.txt
igldapint01
igdbint01
igmsgint02
如果不需要空格:
$ grep -o '[^ ;]*int[^ ;]*' abc.txt
igldapint01
igdbint01
igmsgint02