如何使用awk,shell变量获取两个行号内的内容?

时间:2016-06-30 13:03:25

标签: shell awk

我想使用 awk 获取两个行号内的行:

startline=1
endline=12
location=$1
echo "awk -v startline="$startline" -v endline="$endline" location="$location" \
          'NR>=$startline && NR<=$endline' $location"
awk_command=$("awk -v startline="$startline" -v endline="$endline" \
                      location="$location" \
                   'NR>=$startline && NR<=$endline' $location")

......但这并没有给出预期的回应。能帮忙吗?

由于 Sushma

5 个答案:

答案 0 :(得分:1)

$变量名称中不需要awk

awk -v startline="$startline" -v endline="$endline" 'NR>=startline && NR<=endline' "$location"

此外,您不必将命令存储在任何变量中。

!/bin/bash
startline=1
endline=12
location=$1
echo "awk -v startline="$startline" -v endline="$endline" 'NR>=startline && NR<=endline' "$location""

# The line below is self sufficient.
awk -v startline="$startline" -v endline="$endline" 'NR>=startline && NR<=endline' "$location"
#                                                        ^^^^ No '$' symbol in variable names

答案 1 :(得分:1)

如果您想尝试使用sed:

sed -n "$startline,$endline p" "$location"

答案 2 :(得分:1)

您将awk命令作为带引号的字符串,因此您不会执行它。变化

awk_command=$("awk ... $location")

awk_command=$(awk ... "$location")

然后删除$以修改变量访问权限( awk不是shell ),方法是更改​​:

awk_command=$(awk ... 'NR>=$startline && NR<=$endline' "$location")

为:

awk_command=$(awk ... 'NR>=startline && NR<=endline' "$location")

我假设你的脚本中已有echo "$awk_command"或类似内容!

答案 3 :(得分:0)

假设您将awk的输入文件表示为$location,请尝试以下操作:

awk -v startline="$startline" -v endline="$endline" 'NR>=startline && NR<=endline' $location

awk中的变量不需要/使用$符号。

答案 4 :(得分:0)

一石二鸟(变量 $ awk_command 保存必须两次包含相同的代码行),并使用潜在危险的 eval

startline=1
endline=12
test -r "$1" || exit 1 
location=$1
awk_command="awk -v startline=$startline -v endline=$endline \
            'NR>=startline && NR<=endline' $location"
echo $awk_command
awk_command_output=$(eval $awk_command)
echo "$awk_command_output"

请注意必要包含测试没有,如果某些流氓设置&#34; $ 1 &#34;到'filename ; evil ; deviltry ;' eval 会盲目地去做evil等等。