Làm cách nào để đếm số lần xuất hiện của một chuỗi trong một tệp?


78

Chỉ cần lấy mã này làm ví dụ. Giả sử nó là một tệp HTML / văn bản, nếu tôi muốn biết tổng số lần echoxuất hiện, tôi có thể làm như thế nào bằng cách sử dụng 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 

Câu trả lời:


100

Điều này sẽ xuất ra số dòng chứa chuỗi tìm kiếm của bạn.

grep -c "echo" FILE

Tuy nhiên, điều này sẽ không đếm số lần xuất hiện trong tệp (tức là nếu bạn lặp lại nhiều lần trên một dòng).

biên tập:

Sau khi chơi xung quanh một chút, bạn có thể nhận được số lần xuất hiện bằng cách sử dụng đoạn mã nhỏ bẩn thỉu này:

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

Về cơ bản, điều này sẽ thêm một dòng mới theo sau mọi trường hợp của tiếng vọng để chúng nằm trên một dòng riêng, cho phép grep đếm những dòng đó. Bạn có thể tinh chỉnh regex nếu bạn chỉ muốn từ "echo", trái ngược với "echoing" chẳng hạn.


Vì vậy, tôi có thể làm gì nếu có ít tiếng vang trong cùng một dòng? ví dụ. thời gian vang vang một tiếng vang
Leo Chan

Tôi đã cập nhật câu trả lời của mình hy vọng sẽ phù hợp với bạn.
Manny D

Cảm ơn . Dành cho bạn vài phút nữa, Một câu hỏi nữa. nếu tôi muốn xóa lần xuất hiện thứ ba của tiếng vọng. tôi có thể làm gì?
Leo Chan,

@foodil: Hủy bỏ tiếng vọng 3:sed -e 's/echo//3'
Hoàng tử John Wesley

I có thể gán số sự xuất hiện trong một biến như thế này ?: noOfTable1 = grep -c "table_1row" /var/www/html/INFOSEC/english/news/test.html nhờ
Leo Chan

159

Số lần xuất hiện chuỗi (không đường ) có thể thu được sử dụng grepvới -otùy chọn và wc(word count):

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

Vì vậy, giải pháp đầy đủ cho vấn đề của bạn sẽ như sau:

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

1
Tôi cảm thấy giải pháp của nó đơn giản, không chắc chắn về thời gian phức tạp
kishorebjv

2
Hãy cẩn thận nếu grep cho rằng tệp là "nhị phân", bạn sẽ nhận được đầu ra "1" từ tệp này mọi lúc, hãy thêm -achỉ để an toàn nếu bạn muốn ...
rogerdpack

1

Tôi đang phỏng đoán ở đây vì tôi không hiểu bạn đang hỏi gì.

Tôi nghĩ rằng những gì bạn muốn là đếm số dòng mà trên đó mẫu 'echo' xuất hiện trong tệp đã cho.

Tôi đã dán văn bản mẫu của bạn vào một tệp có tên 6741967.

Đầu tiên, hãy greptìm các kết quả phù hợp:

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

Thứ hai, sử dụng wc -lđể đếm các dòng

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

cảm ơn sự giup đơ của bạn . Xin lỗi vì đã làm cho bạn khó hiểu. Câu hỏi của tôi là để đếm số lần xuất hiện trong các tập tin
Leo Chan

2
Nếu bạn thực hiện grep -o echo 6741967, nó sẽ xuất ra một dòng mới cho mỗi dòng, khi đó bạn có thể sử dụng: grep -o echo 6741967 | wc -l và nó sẽ chiếm nhiều 'echo là trên một dòng duy nhất cũng
Wivlaro

0

Không có câu trả lời hiện có nào phù hợp với tôi với tệp 10GB một dòng. Grep hết bộ nhớ ngay cả trên máy có RAM 768 GB!

$ 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

Vì vậy, tôi đã viết một chương trình Rust rất đơn giản để làm điều đó .

  1. Cài đặt Rust .
  2. cargo install count_occurences
$ count_occurences '0,0,0,0,0,0,0,0,' test.json
99094198

Nó hơi chậm (1 phút cho 10GB), nhưng ít nhất nó không hết bộ nhớ!


-1

nếu bạn chỉ muốn số lần xuất hiện thì bạn có thể làm điều này, $ grep -c "string_to_count" file_name


2
Sẽ không đếm chính xác chuỗi xảy ra hai lần trên cùng một dòng.
Josiah
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.