我的输入文件是这样的:
IDno="1"
Name=Jack
Type=Student
IDno="2"
Name=Jill
Type=Teacher
我使用 sed 来提取所有 IDno 和仅当类型为学生时的类型。
sed -e '/IDno=/b' -e '/Type=Student/b' d
这样我就得到了所有带有学生类型的行,但没有 IDnos。
我想得到
IDno="1"
Type=Student
IDno="2"
但我得到了
Type=Student
我究竟做错了什么?
答案1
使用sed
,要打印特定行,更容易使用-n
选项和p
命令:
sed -rn '/IDno=|Type=Student/p'
或者:
sed -n -e '/IDno=/p' -e '/Type=Student/p'
此-n
选项会抑制输出,除非明确打印。p
当然,该命令会打印匹配的行。
答案2
egrep
可以从文件中获取多行。使用管道|
作为分隔符,您可以提取任意数量的不同条件。 egrep
相当于grep -E
。 egrep
是在文件夹中找到的脚本/bin
,其内容指向exec grep -E "$@"
。
例子:
egrep "IDno=|Type=Student" inputfile
或者
grep -E "IDno=|Type=Student" inputfile
应该输出:
IDno="1"
Type=Student
IDno="2"
希望这可以帮助!
答案3
awk
:将字段分隔符设置为,并打印包含作为整个记录或作为第一个字段的
=
记录:Type=Student
IDno
awk -F= '$1=="IDno" || $0=="Type=Student"'
perl
:IDno
打印以 开头,后跟=
,或以 开头Type
,后跟=
并以 结尾的行Student
:perl -ne 'print if /^(IDno=|Type=Student$)/'
例子:
% cat file.txt
IDno="1"
Name=Jack
Type=Student
IDno="2"
Name=Jill
Type=Teacher
% awk -F= '$1=="IDno" || $0=="Type=Student"' file.txt
IDno="1"
Type=Student
IDno="2"
% perl -ne 'print if /^(IDno=|Type=Student$)/' file.txt
IDno="1"
Type=Student
IDno="2"
答案4
最初的问题似乎是问“提取所有 IDno 和类型仅当类型为学生时。“但是示例输出返回所有 IDno= 行,因此这相当矛盾......
这是一个答案,当 Type=Student 时仅返回 IDno 和 Type。
sed -n 'N;N;/IDno=.*Type=Student/p' filename | grep -v "^Name="
稍微解释一下:
-n, --quiet, --silent
禁止自动打印模式空间N;N;
将下一行输入读取/附加到模式空间。(两次)/IDno=.*Type=Student/p
查找并打印从 IDno= 到 Type=Student| grep -v "^Name="
不显示 Name= 行
我不喜欢 sed|grep,但不太清楚如何让 sed 重新搜索它的输出,而管道通常表示“获取此输出并执行某些操作”……也可以使用 grep|sed
grep -v "^Name=" t | sed -n 'N;N;/IDno=.*Type=Student/p'