Как я могу отобразить остальная часть файла, начиная с совпадающей строки?

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

Для Например, если я использую:

more text.txt | egrep show

, будет отображаться только строка, в которой есть "show" в нем, хотя я бы хотел что-то вроде команды start :

more text.txt | start show

, которая покажет все строки после первой строки, которая соответствует поисковому запросу.

Однако на моем Ubuntu это не работает. Как я могу установить его или что-то подобное?

14
задан 7 April 2021 в 13:13

4 ответа

Если ваш файл меньше, скажем, 10000 строк, вы можете сделать это:

grep -A 10000 show text.txt

Флаг -A покажет строку, содержащую поиск строка ( показать ) и следующие 10000 строк.

Однако я немного поигрался с флагом -A и заметил, что grep разумно комбинирует вывод, поэтому вы не получаете 10001 строку каждый раз, когда строка show найдена. По сути, он покажет вам весь файл один раз, начиная со строки, содержащей show . Если ваш файл содержит более 10000 строк, отрегулируйте параметр соответствующим образом.

Вы можете использовать команду псевдоним , чтобы создать свою собственную команду для достижения того же результата.

РЕДАКТИРОВАТЬ: немного более элегантным решением было бы использовать

 grep show -A $(wc -l < text.txt) text.txt

, который будет использовать фактическую длину файла в качестве флага -A . Для этого необходимо дважды указать имя файла. К сожалению, это предотвратит использование псевдонима, но вы можете написать для этого функцию оболочки.

Видимо, в этом случае нужно сначала указать строку поиска, чтобы избежать ошибки.

15
ответ дан 23 April 2021 в 23:26

Оба диска являются виртуальными дисками в WSL2, так как WSL (ни версия 1, ни версия 2) не обеспечивает прямой доступ к базовому диску/оборудованию узла Windows. WSL1 lsblk просто выдает ошибки, в то время как WSL2 (который вы, очевидно, используете), по крайней мере, делает попытку сопоставить виртуальный диск с его соответствующим устройством Linux.

/dev/sdb , как видно из выходных данных lsblk , является корневой файловой системой для данного экземпляра WSL. При запуске другого экземпляра (путем установки дистрибутива или клонирования существующего) появится третий диск (во всех экземплярах). Вы также можете видеть, что он «присоединен» через dmesg .

При установке WSL Ubuntu по умолчанию /dev/sdb для экземпляра соответствует файлу ext4.vhdx в каталоге % userprofile %\AppData\Local\Packages\< distribution _ пакет >\LocalState\. При создании собственных экземпляров с помощью wsl --import файл можно разместить в любом месте.

/dev/sda - это, я уверен, диск свопа (кредит здесь ). Этот диск является общим для всех экземпляров WSL. Этот виртуальный диск можно найти в % temp %\swap.vhdx . Хотя я не рекомендую, вы можете подтвердить это с помощью:

cat /proc/swaps # shows that the swap file is "/swap/file"
sudo mkdir /mnt/tmpmount
sudo mount /dev/sda /mnt/tmpmount
ls /mnt/tmpmount # shows the "file" is the only thing on the drive

В типичной установке Linux, это было бы более очевидно через монтирование в /etc/fstab , но это, кажется, одна из вещей WSL обрабатывает через свой собственный (bit-of-a-black-box) /init .

-121--914172-

На основе текущего хеша (если смотреть на $1 ), представляется хешом MD5. Если это так, попробуйте это:

openssl passwd -1

Каноническая ссылка будет man page: https://man7.org/linux/man-pages/man3/crypt.3.html

id identifies the encryption method used instead of DES and this
then determines how the rest of the password string is
interpreted.  The following values of id are supported:
ID  | Method
1   | MD5
2a | Blowfish (not in mainline glibc; added in some Linux distributions)
5   | SHA-256 (since glibc 2.7)
6   | SHA-512 (since glibc 2.7)
-121--914072-
awk '/show/,0' text.txt

Awk позволяет указать диапазон условие-выражение, условие-выражение , где действие-код вычисляется для каждой строки между, где первое условие возвращает значение true, до

При использовании константы false 0 в качестве второго условия для соответствующей строки и каждой строки после этого будет выполняться действие по умолчанию {print} .

Если вы хотите определить команду start , awk позволяет передавать переменные последовательности, так что здесь вы идете:

start() {
  awk -v regex="$1" '$0 ~ regex, 0' "${@:2}"
}

$0 ~ regex используется для соответствия последовательности, как если бы это был regex. $0 в состоянии awk относится ко всей строке. «$ {@: 2}» - все командные аргументы после первого, если таковые имеются. Таким путем, при необходимости можно указать файлы для запуска или разрешить их чтение с помощью piped input.

4
ответ дан 23 April 2021 в 23:26

Если grep вам особо не нужен, для этого можно использовать sed или awk :

sed -n '/show/,$p' text.txt
awk '/show/ {display=1} display {print}' text.txt
  • sed обычно выводит все строки, но -n предотвращает это. / show /, $ - диапазон строк, начинающийся с первой строки, соответствующей регулярному выражению show и заканчивается последней строкой ( $ ). Команда print ( p ) выводит этот диапазон строк.
  • awk использует последовательности пар условие { действие } (обычно в отдельных строках для удобства чтения), поэтому / show / условие, которое соответствует регулярному выражению show в любом месте строки ввода, а display = 1 определяет переменную с именем display до 1 . Очевидно, что условие display является сокращенной формой для display! = 0 , а print делает то, что все ожидают, то есть: выводит строку ввода.
24
ответ дан 23 April 2021 в 23:26

В Bash:

word="show"
e=0

while read line
do
    [[ $line =~ "$word" ]] && e=1
    [ $e -eq 1 ] && echo "$line"
done < text.txt

Это можно добавить как функцию к ~ / .bashrc , например:

grep2end () {

word="$1"
e=0

while read line
do
    [[ $line =~ "$word" ]] && e=1
    [ $e -eq 1 ] && echo "$line"
done < "$2"

}

и использовать так:

grep2end "show" "text.txt"
1
ответ дан 23 April 2021 в 23:26

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

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