与字符串行数相关的shell操作

发布时间:2020-10-29编辑:脚本学堂
本文举了一些shell中字符串相关的操作例子,包括查询字符串所在的行号、查找字符串首次匹配的行号、提取字符串所在的行号、比较两次字符串行号变化幅度等。

本文举了一些shell中字符串相关的操作例子,包括查询字符串所在的行号、查找字符串首次匹配的行号、提取字符串所在的行号、比较两次字符串行号变化幅度等。

一、查询字符串所在的行号
grep  -n  "xxx"   str.txt   #  -n 打印字符 “xxx” 在文件 “str.txt” 所在的行数前缀

示例:
str.txt
xxx
yyy
zzz
xxx

输入查找命令: grep  -n  "xxx"   str.txt 

结果如下:
1:xxx
4:xxx

行号1,4在前,匹配字符串“xxx”在后,两者之间用冒号 “:” 隔开

二、查找字符串首次匹配的行号
grep  -n  "xxx"   str.txt  | head -1

结果如下:
1:xxx

同理,查找最后一次匹配的行号
grep  -n  "xxx"   str.txt  | tail -1

结果如下:
4:xxx

查找字符串第二次匹配的行号
grep  -n  "xxx"   str.txt  | head -2 | tail -1# 先取出前两行,然后取最后一行

结果如下:
4:xxx

三、提取字符串所在的行号
grep  -n  "xxx"   str.txt  | cut  -d  ":"  -f  1
先查询字符串 “xxx” 所在的全部行号,然后利用 cut 命令分割“:”字符,提取第一个字段,即行号

结果如下:
1
4

提取首次匹配的行号
grep  -n  "xxx"   str.txt  | head -1  | cut  -d  ":"  -f  1

结果如下:
1

四、比较两次字符串行号变化幅度
两个文件内容: str.txt 和 str2.txt

#----str.txt
xxx
yyy
zzz
xxx

#---str2.txt
yyy
xxx
www
zzz

比较行号脚本
catline.sh
 

复制代码 代码如下:
#!/bin/bash 
 
rm -rf ret.txt 
 
total=`wc -l $1 | linuxjishu/13830.html target=_blank class=infotextkey>awk '{print $1}'` 
echo "total = $total" 
 
num=1 
while read line 
do 
  echo $line 
 
  ret=`grep -n $line $2 | head -1` 
  echo $ret 
 
  if [ -z $ret ]; then 
 num2=$total 
 echo "null num2 = $total" 
  else 
 num2=`echo $ret | cut -d ":" -f 1` 
 echo "num2 = $num2" 
  fi 
 
  echo $num 
  change=`expr $num2 - $num` 
  echo "$num2 - $num = $change" 
 
  num=`expr $num + 1` 
 
  echo "$line=$change" >> ret.txt 
done < $1 
 
cat ret.txt 

执行脚本命令:
./catline.shstr2.txt   str.txt

运行结果如下:
total = 4 
yyy 
2:yyy 
num2 = 2 

2 - 1 = 1 
xxx 
1:xxx 
num2 = 1 

1 - 2 = -1 
www 
 
null num2 = 4 

4 - 3 = 1 
zzz 
3:zzz 
num2 = 3 

3 - 4 = -1 
yyy=1 
xxx=-1 
www=1 
zzz=-1