linux shell命令怎么查找文件中指定字符串,并把这个字符串所在行和下面一行的内容写到另外一个文件中?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux shell命令怎么查找文件中指定字符串,并把这个字符串所在行和下面一行的内容写到另外一个文件中?相关的知识,希望对你有一定的参考价值。

比如1.txt文件中内容
aaa:
1234
bbb:
5678
aaabbb:
1988
要把aaa所在行及下一行内容写到2.txt文件中。
处理结果2.txt:
aaa:
1234
aaabbb:
1988

没分了,下次有分一定给您,谢谢!

有两种写入方式:

1、grep -i "aaa" -A 1  1.txt | grep -v  -e  "--" >2.txt

grep 指令用于查找内容包含指定的范本样式的文件,如果发现某文件的内容符合所指定的范本样式,预设grep指令会把含有范本样式的那一列显示出来。若不指定任何文件名称,或是所给予的文件名为“-”,则grep指令会从标准输入设备读取数据。

2、awk '/aaa/getline var;print $1"\\n" var' 1.txt >2.txt

awk语言的最基本功能是在文件或者字符串中基于指定规则浏览和抽取信息,awk抽取信息后,才能进行其他文本操作。完整的awk脚本通常用来格式化文本文件中的信息。

linuxshell中引号的使用方法:

shell使用引号(单引号/双引号)和反斜线("\\")用于向shell解释器屏蔽一些特殊字符,反引号(")对shell则有特殊意义。

如:abc="how are you" (bash/pdksh)

set abc = "how are you" (tcsh)

这个命令行把三个单词组成的字符串how are you作为一个整体赋值给变量abc.

abc1='@LOGNAME,how are you!' (bash/pdksh)

set abc1='$LOGNAME,how are you!' (tcsh)

abc2="$LOGNAME,how are you!" (bash/pdksh)

set abc2="$LOGNAME,how are you!" (tcsh)。

参考技术A 这个问题太有想像力了,命令如下。

grep -i "aaa" -A 1 1.txt | grep -v -e "--" >2.txt本回答被提问者采纳
参考技术B awk '/aaa/getline var;print $1"\n" var' 1.txt >2.txt追问

谢谢两位回答,两种方法都试了都可以,多谢了。
其中第二种方法是从字符串开始截取第一行内容的

linux下如何提取日志中指定的一段内容?100分急求!!!

有一段日志,内容大致如下:

xxxxx
xxx[SIP/2.0 xxx
xxxxx
xxx1234
xxx
]
xxxx
其中,SIP/2.0是起始关键字,最后的右方括号是结束关键字(起始关键字和结束关键字在日志里是成对出现的,1234是用户,可能有别的用户的),这一段内容中包含1234这个字符串,用什么命令,怎么提取这样一段内容呢?急求!!
还有补充一下,实际情况是这样的,linux主机上有一个log,记录了很多用户的通话,日志是不断刷新的,我需要用tail -f结合其他命令,在新出来的日志中过滤出我需要的这段内容,再保存到相应的文件中!

其实要说回答很简单,但是要给你做出来稍微费工夫,因为没有环境可以测试,你可以写一段shell代码来提取,也可以用sed/awk/grep等命令来做,但是命令的复杂度不亚于写一段shell代码。shell代码我给你算法吧。(括号里是参考代码,bash)
初始化变量(flg=0)
循环读取每一行文件(while line in `cat $log`)

变量开始[sip/2.0]为真时( if [ $flg -eq 1 ]; then )

输出当前行到结果文件中( echo $line >> $retFile )

如果是用户结束 ( chkEnd $line #chkEnd 是个shell函数检查是不是结束

if [ $? -eq 1 ]; then)
变量变量开始[sip/2.0]设置为假 (flg=0)

#如果是用户结束(fi)

否则(else)
如果当前行含有[sip/2.0]( echo $line | grep "[sip/2.0"

if [ $? -eq 0 ]; then)
输出当前行到结果文件中(echo $line >> $retFile)
变量变量开始[sip/2.0]设置为真(flg=1)
#如果当前行含有[sip/2.0](fi)
#变量开始[sip/2.0]为真时(fi)追问

我想用sed,但是现在提取出来很多以sip/2.0开始,并以]结束的日志段,由于有很多用户,就有很多段日志,怎么只提取我需要的用户的日志段呢?日志段中间有一个字符串是用户的号码。

追答

你能理解我在回答中的shell代码吧?
如果能的话就好办,其中chkEnd是一个自定义的shell函数,让这个值返回三个结果就可以了,0:不是结束,1:是结束语句,但不是想要的用户 2:是结束语句并且是想要的用户
程序做以下修改
1, 变量开始[sip/2.0]为真时( if [ $flg -eq 1 ]; then )
输出当前行到临时文件中( echo $line >> $tempFile )
2. 如果是用户结束,(其他的跟原来一样)
如果是想要的用户
将临时文件内容输出到结果文件
// 如果是想要的用户
清空临时文件

参考技术A 很简单,使用 grep -A 3 SIP 文件名
-A 3表示关键词所在行以下三行的内容
参考技术B 给你个思路,
tail -f 日志文件名|sed '/起始字段/,/结束字段/p' | grep -C 3 "用户号码"

djy@game-rd10:~> sed -n '/SIP/,/]/p' filename|grep -C 3 "1234"
[SIP/2.0
xx.ccc.kkkk.eeeee
1234
sss.werwer.sfdsfd.12323
sdf.sf
234423.sdf.234
我的测试结果,3表示号码在内的上下3行,你根据你自己需要修改
参考技术C 很简单,压缩文件解压后:
egrep -o [0-9]+ 日志文件
参考技术D 你可以使用vim两个快捷键非常方便:
1.cp一份日志到随便一个目录(保留原文件)
2.使用vim或者vi打开复制的文件,把光标移动到你想要的内容的第一行,按两下g,也就是gg,这样以上的内容就删除了
3.把光标移动到你想要的内容的最后一样按两下G,注意是大写的,这样下面不想要的内容就删除了
4.最后保存就OK了
应该还有比这个方法更快的,但是你应急就先用这个吧追问

大哥··忘了说了,我是需要用命令提取而不是手工去查找啊!
还有补充一下,实际情况是这样的,linux主机上有一个log,记录了很多用户的通话,日志是不断刷新的,我需要用tail -f结合其他命令,在新出来的日志中过滤出我需要的这段内容,再保存到相应的文件中!

追答

这段内容是一行还是多行呢? 如果是一行就好办了,用for循环写个小脚本,cat grep就行,如果是多行的话,我得搜搜grep大法。。

以上是关于linux shell命令怎么查找文件中指定字符串,并把这个字符串所在行和下面一行的内容写到另外一个文件中?的主要内容,如果未能解决你的问题,请参考以下文章

如何用shell提取文件中指定的字符串

如何用shell提取文件中指定的字符串

shell脚本查找json文件中指定key的值并进行替换

linux下如何提取日志中指定的一段内容?100分急求!!!

c++ 文本文件中查找字符串

怎样在emacs中进行多文件字符串查找/替换