我有一份学生名单,我已将其保存到文本文件中
students.txt
。
John Doe Marketing Junior B
Betty Metty Engineering Junior A
James Names Nursing Sophomore B
Bob Nob History Freshman B
Hope Nope Engineering C
这可能非常简单,但由于我是 shell 脚本编写的初学者,什么 sed 模式命令可以打印出专业为 A(字母@结尾)的人,仅名字和姓氏?
如果您可以链接一个有用的网站来获取与列表相关的 sed 模式搜索规则,那就太好了。使用vim,Ubuntu 16.04
awk '$5=="A"{print $1, $2}' file
输出Betty Metty
编辑、过滤“engineering”字符串:awk '$5=="A" && $3=="Engineering"{print $1, $2}' file
$ cat ip.txt
John Doe Marketing Junior B
Betty Metty Engineering Junior A
James Names Nursing Sophomore B
Bob Nob History Freshman B
Hope Nope Engineering C
$ sed -nE '/A$/ s/^(\S+\s+\S+).*/\1/p' ip.txt
Betty Metty
-n
默认不打印行
-E
使用扩展正则表达式
/A$/
匹配行尾的
A
s/^(\S+\s+\S+).*/\1/p
捕获由空格分隔的前两个非空格字符序列,省略行的其余部分并打印此修改后的行
sed
,用于就地编辑:
sed -i -nE '/A$/ s/^(\S+\s+\S+).*/\1/p' ip.txt
与vim
:v/A$/d | s/\v^(\S+\s+\S+).*/\1/
v/A$/d
删除所有不以
A
结尾的行
|
添加另一个命令
s/\v^(\S+\s+\S+).*/\1/
使用非常神奇的模式
\v
来减少所需的
\
,就像
-E
选项一样
sed -n -e '/A$/p' input_file | awk '{print $1 $2}'
sed -n 表示默认情况下不打印任何内容。
/A$/p
表示打印最后一个字符为“A”的任何内容。