Передача переменных с одной стороны линии linux на другую

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

Теперь то, что я пытаюсь сделать, это -

$a=sed -n '/Stats/=' file.txt | sed -n '$a,$p' file.txt

Конечно, это не работает выше, но что мне делать?

Ex- предположим, что это слово нет. 40, тогда я хочу напечатать все, начиная с строки 41 до конца.

Скажите, пожалуйста, как передать переменные с одной стороны трубы на другую? Кроме того, если кто-то мог бы сделать другой способ сделать это, это было бы, если бы большая помощь.

благодаря

3 ответа

Извините, это будет очень быстро, нужно вернуться к работе. Вы хотите AWK для этого.

awk '/Stats/,0' FILE

Вывод:

Stats
s
dfsdfsd


sdfsdfsdfsd

Файл:

lwjeawfasdfas
sdafdsfasdfasdf

asdfasdfasdfsadf


asdfas
1122


Stats
s
dfsdfsd


sdfsdfsdfsd

Он соответствует всем строкам, начинающимся с строки, которая соответствует "pattern1" и продолжается до тех пор, пока строка не будет соответствовать "pattern2" (включительно). В этом однострочном "шаблоне1" есть регулярное выражение "/Stats/" и "pattern2" равно 0 (false). Таким образом, этот однострочный шрифт печатает все строки, начиная с строки, которая соответствует "/Stats/", продолжающейся до конца файла (поскольку 0 всегда false, а "pattern2" никогда не совпадает).

Повеселись...


Еще одно awk решение

awk '/Stats/ {f=1} f' file

Когда слово Stats найдено, установите флаг f в значение true. Если f истинно, выполните действие по умолчанию, напечатайте строку, такую же, как {print $0}


Непосредственная передача переменных с одной стороны Linux-канала в другую невозможна, потому что команды с обеих сторон канала выполняются в fork() ed. Это означает, что эти команды выполняются в своей собственной копии (по одной стороне каждой стороны) процесса родительской оболочки. Таким образом, они получат копии переменных в родительском процессе, но не смогут напрямую изменять исходные переменные в родительском. Из этого следует, что копии переменных в подоболочках по обе стороны от трубы будут полностью независимы друг от друга, кроме того, что они должны наследовать те же начальные значения от родителя.

Чтобы проиллюстрировать это, мы можем запустить следующие команды:

a=100
(echo "LHS pre: $a" 1>&2; ((a++)); echo "LHS post: $a" 1>&2) | ( echo "RHS pre: $a" 1>&2 ; ((a+=10)); echo "RHS post: $a" 1>&2 )
echo "Parent final: $a" 1>&2

Выход:

RHS pre: 100
RHS post: 110
LHS pre: 100
LHS post: 101
Parent final: 100

Здесь мы устанавливаем переменную a в 100 в процессе родительской оболочки. LHS и RHS (левая сторона и правая сторона) трубы второй команды получают копии этой переменной. LHS печатает переменную копирования, увеличивает ее на 1, а затем печатает снова. RHS печатает переменную копирования, увеличивает ее на 10, а затем снова печатает. Затем родительская оболочка печатает исходную версию переменной. Мы можем видеть, что подошвы LHS и RHS постепенно увеличивают свои копии переменной независимо. И тогда мы также видим, что оригинал в родительском объекте полностью не зависит от модификаций LHS и RHS подоболочек.

Теперь я закончил с теорией. Вот некоторые решения проблемы, с которой вы на самом деле сталкиваетесь. Возможно, это не так элегантно, но для тех из нас, которые делают все возможное, чтобы не читать sed и awk manpages, вот пара альтернатив:

  1. с "простыми" инструментами - head, tail, grep и cut
  2. с чистым bash

,

ubuntu@ubuntu:~$ cat stats.txt 
The first line
The 2nd line
the line with stats in it
another line
another line with stats
another line
the last line
ubuntu@ubuntu:~$ tail -n-$(($(grep -n stats stats.txt | head -n1 | cut -d: -f1)+1)) stats.txt 
another line
another line with stats
another line
the last line
ubuntu@ubuntu:~$ fl=""; while read -r line; do [ "$fl" ] && echo -e $line; [[ $line =~ stats ]] && fl=1; done < stats.txt
another line
another line with stats
another line
the last line

licensed under cc by-sa 3.0 with attribution.