Ces*_*pez 0 grep awk shell-script
我有一个这样的文本文件:
first, second
hello, bye
one, two
good, bad
day, night
Run Code Online (Sandbox Code Playgroud)
我想要一个脚本,它基于一个变量,使用grep
或检索给定行的最后一个单词awk
。
例如:如果 num 是3
,则输出应该是two
。
没有必要询问 num 的值。
使用awk
:
$ awk -v num="$num" 'NR == num { print $NF }' data.in
Run Code Online (Sandbox Code Playgroud)
测试它:
$ num=3
$ awk -v num="$num" 'NR == num { print $NF }' data.in
two
Run Code Online (Sandbox Code Playgroud)
该awk
脚本逐条读取输入文件(一条记录默认为一行)。一旦它命中与num
变量对应的记录,它就会打印该记录的最后一个字段(默认情况下,一个字段是一个以空格分隔的列)。
该num
内部变量awk
脚本是awk
,我们初始化到外壳变量的值变量num
与-v num="$num"
在命令行上。
NR
是当前记录号,NF
是该记录中的字段数。 $NF
是最后一个字段的数据。
如果您的文件严格以逗号分隔,请添加-F ','
到命令行:
$ awk -v num="$num" -F ',' 'NR == num { print $NF }' data.in
Run Code Online (Sandbox Code Playgroud)
随着grep
你不能选择一个特定的路线,但加上sed
可以筛选出你想要的行,然后拿到最后一个逗号后的最后一位:
$ sed -n "${num}p" data.in | grep -o '[^,]*$'
Run Code Online (Sandbox Code Playgroud)
该sed
位将获取指定的行,而该grep
位将提取该行最后一个逗号之后的所有内容。
你也可以这样做sed
:
$ sed -n "${num}s/^.*,\(.*\)$/\1/p" data.in
Run Code Online (Sandbox Code Playgroud)
此处,替换仅应用于编号为 的行$num
,并将整行替换为最后一个逗号之后的行的内容并输出结果。使用-n
命令行开关禁止所有其他输出。
或者,使用 in 替换sed
来简单地删除行上的所有内容,直到最后一个逗号:
$ sed -n "${num}s/^.*,//p" data.in
Run Code Online (Sandbox Code Playgroud)