我正在查看从第 7 行第 18 列开始的不同版本号的文件。
使用 Bash 从第 7 行(即“字符”)第 18 列到行尾读取(到 $ 变量中)字符串的最佳方法是什么?到该行的倒数第 5 个字符呢?
sed
方式:
variable=$(sed -n '7s/^.\{17\}//p' file)
编辑(感谢评论者):如果通过列表示字段(用制表符或空格分隔),则可以将命令更改为
variable=$(sed -n '7s/^\(\s\+\S\+\)\{17\}//p' file)
采用
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)}')
根据您要使用的实用程序,您有多种不同的方法可以解决此问题。您的一个选择是通过以下任何一种方式使用 Bash 的子字符串扩展:
line=1
string=$(sed -n "${line}p" /etc/passwd)
echo "${string:17}"
line=1
string=$(awk "NR==${line} {print}; {next}" /etc/passwd)
echo "${string:17}"
line=1
string=`{ head -n $line | tail -n1; } < /etc/passwd`
echo "${string:17}"
如果“列”是指“字段”:
a=$( awk 'NR==7{ print $18 }' file )
如果您真的想要第 7 行末尾的第 18 个字节,请执行以下操作:
a=$( sed -n 7p | cut -b 18- )