Як я можу порахувати випадки появи рядка у файлі?


79

Просто візьміть цей код як приклад. Роблячи вигляд, що це HTML / текстовий файл, якщо я хотів би знати загальну кількість разів, що echoз’являється, як я можу це зробити за допомогою bash?

new_user()
{
    echo "Preparing to add a new user..."
    sleep 2
    adduser     # run the adduser program
}

echo "1. Add user"
echo "2. Exit"

echo "Enter your choice: "
read choice


case $choice in
    1) new_user     # call the new_user() function
       ;;
    *) exit
       ;;
esac 

Відповіді:


101

Це виведе кількість рядків, які містять рядок пошуку.

grep -c "echo" FILE

Однак це не буде враховувати кількість випадків у файлі (тобто, якщо у вас є луна кілька разів на одному рядку).

редагувати:

Погравши трохи, ви можете отримати кількість випадків, використовуючи цей брудний дрібний код:

sed 's/echo/echo\n/g' FILE | grep -c "echo"

Це в основному додає новий рядок після кожного екземпляра луни, тому вони знаходяться на своєму рядку, дозволяючи grep підраховувати ці рядки. Ви можете уточнити регулярний вираз, якщо вам потрібне лише слово "луна", на відміну від "луна", наприклад.


Отже, що я можу зробити, якщо в одному рядку мало луни? напр. echo time echo a echo
Лео Чан

Я оновив свою відповідь, яка, сподіваюся, має працювати для вас.
Менні Д,

Дякую . Витратьте ще кілька хвилин, ще одне запитання. якщо я хотів би видалити третю зустріч відлуння. що я можу зробити?
Leo Chan

@foodil: Видалити 3-е ехо:sed -e 's/echo//3'
Принц Джон Уеслі

Чи можу я призначити кількість випадків у такій змінній ?: noOfTable1 = grep -c "table_1row" /var/www/html/INFOSEC/english/news/test.html дякую
Лео Чан,

159

Кількість вхідних рядків (не рядків ) можна отримати за grepдопомогою -oпараметрів і wc(кількість слів):

$ echo "echo 1234 echo" | grep -o echo
echo
echo
$ echo "echo 1234 echo" | grep -o echo | wc -l
2

Тож повне рішення вашої проблеми буде виглядати так:

$ grep -o "echo" FILE | wc -l

1
Я вважаю, що це просте рішення, я не впевнений у складності часу
kishorebjv

2
Будьте обережні, якщо grep вважає, що файл "двійковий", ви щоразу отримуватимете з цього "1", додайте -aпросто, щоб перестрахуватися, якщо хочете ...
rogerdpack

1

Я беру тут деякі здогади, бо я не зовсім розумію, про що ви запитуєте.

Я думаю, що те, що ви хочете, це підрахунок кількості рядків, на яких шаблон "луна" з'являється у даному файлі.

Я вставив ваш зразок тексту у файл із назвою 6741967 .

Спочатку grepзнаходить збіги:

james@Brindle:tmp$grep echo 6741967 
    echo "Preparing to add a new user..."
echo "1. Add user"
echo "2. Exit"
echo "Enter your choice: "

По-друге, використовуйте wc -lдля підрахунку рядків

james@Brindle:tmp$grep echo 6741967  | wc -l
       4

дякую за допомогу. Вибачте, що змусив вас заплутати. Моє питання полягає в тому, щоб підрахувати кількість випадків у файлі
Лео Чан

2
Якщо ви зробите grep -o echo 6741967, він видасть новий рядок для кожного з них, тоді ви можете використовувати: grep -o echo 6741967 | wc -l, і це також враховуватиме кілька ехо-
сигналів

0

Жодна з існуючих відповідей не працювала для мене з однорядковим файлом на 10 Гб. У Грепа не вистачає пам'яті навіть на машині з 768 ГБ оперативної пам'яті!

$ cat /proc/meminfo | grep MemTotal
MemTotal:       791236260 kB
$ ls -lh test.json
-rw-r--r-- 1 me all 9.2G Nov 18 15:54 test.json
$ grep -o '0,0,0,0,0,0,0,0,' test.json  | wc -l
grep: memory exhausted
0

Тому я написав для цього дуже просту програму Rust .

  1. Встановіть Rust .
  2. cargo install count_occurences
$ count_occurences '0,0,0,0,0,0,0,0,' test.json
99094198

Це трохи повільно (1 хвилина на 10 ГБ), але принаймні пам’яті у нього не закінчується!


-1

якщо ви просто хочете кількість випадків, то ви можете це зробити, $ grep -c "string_to_count" ім'я_файла


2
Не буде правильно рахувати рядок, який двічі трапляється на одному рядку.
Джосія
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.