Подтвердить что ты не робот

Как использовать Head and Tail для печати определенных строк файла

Я хочу сказать, что выходные строки 5 - 10 файла, в качестве аргументов переданы.

Как я могу использовать head и tail для этого?

где firstline = $2 и lastline = $3 и filename = $1.

Запуск должен выглядеть следующим образом:

./lines.sh filename firstline lastline
4b9b3361

Ответ 1

Помимо ответов, приведенных fedorqui и Kent, вы также можете использовать один sed команда:

#! /bin/sh
filename=$1
firstline=$2
lastline=$3

# Basics of sed:
#   1. sed commands have a matching part and a command part.
#   2. The matching part matches lines, generally by number or regular expression.
#   3. The command part executes a command on that line, possibly changing its text.
#
# By default, sed will print everything in its buffer to standard output.  
# The -n option turns this off, so it only prints what you tell it to.
#
# The -e option gives sed a command or set of commands (separated by semicolons).
# Below, we use two commands:
#
# ${firstline},${lastline}p
#   This matches lines firstline to lastline, inclusive
#   The command 'p' tells sed to print the line to standard output
#
# ${lastline}q
#   This matches line ${lastline}.  It tells sed to quit.  This command 
#   is run after the print command, so sed quits after printing the last line.
#   
sed -ne "${firstline},${lastline}p;${lastline}q" < ${filename}

Или, во избежание использования внешних приложений, если вы используете последнюю версию bash (или zsh):

#! /bin/sh

filename=$1
firstline=$2
lastline=$3

i=0
exec <${filename}  # redirect file into our stdin
while read ; do    # read each line into REPLY variable
  i=$(( $i + 1 ))  # maintain line count

  if [ "$i" -ge "${firstline}" ] ; then
    if [ "$i" -gt "${lastline}" ] ; then
      break
    else
      echo "${REPLY}"
    fi
  fi
done

Ответ 2

head -n XX # <-- print first XX lines
tail -n YY # <-- print last YY lines

Если вам нужны линии от 20 до 30, это означает, что вы хотите, чтобы 11 строк начинались с 20 и заканчивались на 30:

head -n 30 file | tail -n 11
# 
# first 30 lines
#                 last 11 lines from those previous 30

То есть сначала вы получаете первые строки 30, а затем вы выбираете последний 11 (то есть 30-20+1).

Итак, в вашем коде это будет:

head -n $3 $1 | tail -n $(( $3-$2 + 1 ))

На основе firstline = $2, lastline = $3, filename = $1

head -n $lastline $filename | tail -n $(( $lastline -$firstline + 1 ))

Ответ 3

попробуйте этот однострочный слой:

awk -vs="$begin" -ve="$end" 'NR>=s&&NR<=e' "$f"

в следующей строке:

$begin is your $2
$end is your $3
$f is your $1

Ответ 4

Сохраните это как " script.sh":

#!/bin/sh

filename="$1"
firstline=$2
lastline=$3
linestoprint=$(($lastline-$firstline+1))

tail -n +$firstline "$filename" | head -n $linestoprint

НЕТ ОБРАБОТКИ ОШИБКИ (для простоты), поэтому вам нужно позвонить в script следующим образом:

./script.sh yourfile.txt firstline lastline

$ ./script.sh yourfile.txt 5 10

Если вам нужна только строка "10" из файла yourfile.txt:

$ ./script.sh yourfile.txt 10 10

Пожалуйста, убедитесь, что: (firstline > 0) AND (lastline > 0) AND (firstline <= lastline)