linux查找字符串所在行,输出行号

查找某个字符串所在行,可以用grep或awk来解决。
二者最大区别是,grep的结果是输出匹配内容的同时输出其所在行号;
awk可以仅输出行号,不输出匹配内容。
按需选择。

【模糊匹配 】输出行号

  • grep
# 输出内容同时输出行号
grep -n "要匹配的字符串" 文件名
  • awk
# 输出行号,并不输出内容
# 注意是单引号
awk '/要匹配字符串/{print NR}' 文件名

【精确匹配(全匹配)】输出行号

  • grep
grep -wn "要匹配的字符串" 文件名

其中 grep -w 是完全匹配要匹配的字符串,字符串只是字段内一部分也可以匹配。比如,

# 结果为abcd, abcde, abc等
grep "abc" 
# 结果为abc
grep -w "abc" 
  • awk

awk并不能像grep那样去过滤单词。grep可以过滤到单词,awk只能过滤到字段。

# 匹配以逗号为分隔(如csv)的第三列/第三个字段,打印行号
awk -F, '$3=="要匹配的字符串" {print NR}' 文件名

# 匹配以逗号为分隔(如csv)的第三列/第三个字段
# 打印该行内容 写{print}或{print $0} 都可以
awk -F, '$3=="要匹配的字符串" {print}' 文件名

如果非要过滤到单词,可以根据单词的格式不同,利用正则表达式来灵活具体得精确匹配。
上面的语法awk "/要匹配字符串/{print NR}" 文件名/要匹配字符串/斜线里面的就是正则表达式的部分。
例如文件中单词是两侧空白的格式,比如 a aa aaa ,就用空格来表示单词旁边的空白,这样就能匹配到 a,而不会匹配到 aa 了。
再例如文件中单词是用双引号来分隔的,“a”“aa”“aaa” ,就可以再查找时加上双引号""来匹配了。
就是具体得搜索,也算是个办法吧。如果遇到了,还是更推荐使用grep -w。

# 具体例子
# 单词以空格分隔的时候,可以加上空格来搜索单词
awk '/ aa /{print NR}' 文件名

# 单词以双引号分隔的时候,可以加上引号来搜索单词
# (以单引号分隔的单词这个方法行不通)
awk '/"aa"/{print NR}' 文件名

但注意这个方法可能会漏掉很多目标,比如"a c aa a a",第一个和最后一个a就会漏掉,只能找到倒数第二个a。所以重复一下,非要过滤到比字段更小的单词程度,更推荐使用grep -w。

用grep,只输出行号,不输出内容

上面说了用grep,是输出内容同时输出行号。
如果只想要行号,不想要内容,一般来说,用awk就足够了。
不知道有没有应用场景,假设想要匹配字段里的某个单词,同时又只要输出行号呢。
下面是想到的一种做法。
例如,在test.txt找word这个字符串,只输出行号

$ cat test.txt 
word words,ok oks
ok,ok,words word
words,wordword
picture pictures,word words

# 用grep匹配到单词,做一个中间文件,利用awk来只输出行号
$ grep -wn "word" test.txt > test_with_no.txt |awk -F: '{print $1}' test_with_no.txt 
1
2
4

继续看看匹配的内容

# 查看一下grep的内容,是没有匹配第三行的
$ grep -wn "word" test.txt
1:word words,ok oks
2:ok,ok,words word
4:picture pictures,word words

# awk 做不到搜索单词上的精确匹配
$ awk '/word/{print $0}' test.txt 
word words,ok oks
ok,ok,words word
words,wordword
picture pictures,word words

# awk 含有~ 这个写法也是模糊查询
$ awk -F, '$2~"word" {print $0}' test.txt 
words,wordword
picture pictures,word words

# awk == 是字段匹配
$ awk -F, '$2=="word" {print $0}' test.txt 
#(无结果)

(以上)

发布了27 篇原创文章 · 获赞 2 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/Olivia_Vang/article/details/104076272