Bash:从特定文件行打印列?

时间:2012-06-12 17:37:48

标签: string bash file-io

我正在查看所有版本号都从第7行第18行开始的文件。

Bash在第7行读取(转换为$变量)字符串的最佳方法是什么,从列,即“字符”,18到行尾?这条线的第5个到最后一个字符怎么样?

4 个答案:

答案 0 :(得分:1)

sed方式:

variable=$(sed -n '7s/^.\{17\}//p' file)

编辑(感谢评论者):如果按列表示字段(用制表符或空格分隔),则命令可以更改为

variable=$(sed -n '7s/^\(\s\+\S\+\)\{17\}//p' file)

答案 1 :(得分:1)

使用

var=$(head -n 17 filename | tail -n 1 | cut -f 18-)

var=$(awk 'NR == 17' {delim = ""; for (i = 18; i <= NF; i++) {printf "%s%s", delim, $i; delim = OFS}; printf "\n"}')

如果您的意思是“字符”而不是“字段”:

var=$(head -n 17 filename | tail -n 1 | cut -c 18-)

var=$(awk 'NR == 17' {print substr($0, 18)}')

答案 2 :(得分:1)

根据您要使用的实用程序,您可以采用多种不同的方式。您可以选择以下列任何一种方式使用Bash的子字符串扩展:

SED

line=1
string=$(sed -n "${line}p" /etc/passwd)
echo "${string:17}"

AWK

line=1
string=$(awk "NR==${line} {print}; {next}" /etc/passwd)
echo "${string:17}"

的coreutils

line=1
string=`{ head -n $line | tail -n1; } < /etc/passwd`
echo "${string:17}"

答案 3 :(得分:0)

如果用“列”表示“字段”:

a=$( awk 'NR==7{ print $18 }' file )

如果您真的希望第7行到第7行结束,请执行:

a=$( sed -n 7p | cut -b 18- )