Просмотрите файл и распечатайте текст с определенных строк

У меня есть файл с данными, которые я сохраняю. Теперь я хотел бы распечатать результаты в новый файл.

Например, возьмем этот пример, randomlog.log:

Link encap:Ethernet HWaddr 08:00:00:00:00:67
inet addr:10.10.10.10 Bcast:10.10.10.10 Mask:255.255.255.0
inet6 addr: fe80::casf:sdfg:23ra:dg12/64 Scope:Link

Как я могу взять только данные из От 12-го по 20-й символ первой строки, а затем от 4-го до 8-го символа 3-й линии? Результат будет выглядеть примерно так:

Ethernet
t6 ad

Возможно ли это? Я хочу установить линию и позицию в эту позицию.

1
задан 4 November 2017 в 22:15

1 ответ

awk:

$ awk 'NR==1{print substr($0,12,8)};NR==3{print substr($0,4,4)}' input.txt  
Ethernet
t6 a

Использует NR для определения строки (в awk-терминологии - запись) и, соответственно, print substring строки. Функция substr() находится в формате

substr(string,starting position,how much offset) 

Python

$ python -c 'import sys                                                                                                                                                
> for index,line in enumerate(sys.stdin,1):                                                                                                                            
>     if index == 1:
>          print line[11:19]
>     if index == 3:
>          print line[3:7]' < input.txt
Ethernet
t6 a

Использует оператор оболочки < для перенаправления входного потока на процесс python из входного файла. Обратите внимание, что строки в python имеют 0-индексирование, поэтому вам нужно сдвинуть ваши искомые номера символов на 1.

portable shell way

Это работает в ksh, dash , bash.

#!/bin/sh

rsubstr(){
    i=0;
    while [ $i -lt  $2 ];
    do
        rmcount="${rmcount}?"
        i=$(($i+1))
    done;
    echo "${1#$rmcount}"
}

lsubstr(){
    printf "%.${2}s\n" "$1"
}

line_handler(){
    case $2 in
        1) lsubstr "$(rsubstr "$1" 11)" 8 ;;
        3) lsubstr "$(rsubstr "$1" 3)" 5 ;;
    esac
}

readlines(){
    line_count=1
    while IFS= read -r line;
    do
        line_handler "$line" "$line_count"
        line_count=$(($line_count+1))
    done < $1
}

readlines "$1"

И он работает так:

$ ./get_line_substrings.sh input.txt                                                                                                                                   
Ethernet
t6 ad
1
ответ дан 23 May 2018 в 02:57

Другие вопросы по тегам:

Похожие вопросы: