命令行方式以上下文查看文件的一行?

命令行方式以上下文查看文件的一行?

我想在 Linux 的命令行上显示带有上下文的文件的某一行或多行,有点像统一的差异:

$ (something) -l 154 stuff.py

   150:  def foo(bar):
   151:    """
   152:    Does the thing.
   153:    """
>> 154:    x = some_calculation()
   155:    y = something_else()
   156:    x.baz(y)
   157:    return x.quux()

是否有捷径可寻?

答案1

很多时候,当我在 grep 中搜索某些内容时,我会打开上下文选项 (-C)。因此,如果您想要基于搜索关键字的上下文,您可以这样做:

grep -C3 searchpattern file

这将为您提供上下文的上方 3 行和下方 3 行。根据需要增加/减少。您还可以使用 -A 数字(上方)和 -B 数字(下方)来获取上方和下方的具体数量。如果您想按行号进行具体操作,可以尝试使用 nl 命令对行进行编号,然后根据匹配的数字使用 grep -C3。例如,要获取第 26 行:

nl -n ln -ba inputfile | grep -C3 "^26 "

但这有点棘手,因为您必须将这些格式选项传递给 nl 以使其不在数字格式中放置制表符和其他内容。grep 还有一个行号选项(-n),您可以像这样将内容通过 grep 两次,首先基于不匹配任何内容(双引号),然后基于行号:

grep -n "" inputfile | grep -C3 "^26:"

只需确保在正则表达式中使用一些上下文来匹配行号,这样您就不会匹配诸如 126 或 260 等的内容。

答案2

尝试这个

head -157 <filename> | tail -7

需要一点算术,但基本思想是:

head -<line number + trailing lines> | tail -<total lines to see>

答案3

呆呆地:

awk -v L=154 'NR==L { printf ">> %5s: ", NR; print $0 ; next } (L-3 <= NR) && (NR <= L+3) { printf "   %5s: ", NR; print $0 }' stuff.py

只需将其粘贴到 shell 脚本中即可。

答案4

这用于nl添加可配置的行号。
参数 1 和 2 按照您的问题(但不是-l
参数 3 和 4 是引导线和尾线的数量(默认值为 3)

[[ "$1" == "" ]] && lnum=0 || lnum=$(($1)); ((lnum==0)) && echo "ERROR: Line number: $1" &&  exit 1 
[[ ! -f "$2"  ]] && echo "ERROR: Input file: $2" && exit 2 || file="$2"
[[ "$3" == "" ]] && lead=3 || ((lead=$3)) # default 
[[ "$4" == "" ]] && tail=3 || ((tail=$4)) # default
((lnum<=lead)) && ((lead=lnum-1))
mesg="/tmp/$USER.$(basename $0).mesg"; [[ -f "$mesg" ]] && rm "$mesg"
marg=": "
mark=">>"
nl -s "$marg" "$file" \
| sed -n "$((lnum-lead)),$((lnum+tail)) p" | tee >(wc -l >"$mesg") \
| sed "s/^\([ ]*$lnum\)$marg\(.*\)/\1$mark\2/"
lnct=$(cat "$mesg"); rm "$mesg"
((lnct<((lead+tail+1)))) && echo "Waring: EOF"

输出

  21: 
  22: class InsertTimestampPlugin(gedit.Plugin):
  23:   def __init__(self):
  24>>    gedit.Plugin.__init__(self)
  25: 
  26:   def insert_datetime(self, action, window):
  27:     doc  = window.get_active_document()

相关内容