tìm kiếm một tập tin và tạo một tập tin mới chỉ khi một điều kiện được đáp ứng


10

Tôi có một logfile và tôi muốn tìm kiếm chuỗi đó và chỉ khi chuỗi đó được tìm thấy, một tệp mới sẽ được tạo. Làm thế nào tôi có thể đạt được điều này, sed doenst dường như phù hợp trong trường hợp này.


3
Sử dụng grepđể tìm kiếm. Các -qtùy chọn sẽ ngăn chặn tất cả các đầu ra, và quay trở lại trận đấu / nonmatch qua grep's mã thoát, đó là dễ dàng kiểm chứng.
hát rong

2
Nó có thể hữu ích để cho chúng tôi biết tình trạng này là gì.
j0h

Câu trả lời:


16

Đánh giá ngắn mạch sau grep:

grep -q 'search_pattern' /file && : >/newfile
  • grep -qkhông tạo đầu ra trên STDOUT, chỉ thoát với trạng thái thoát 0nếu tìm thấy mẫu trên tệp

  • Nếu mẫu được tìm thấy ( &&), hãy tạo một tệp /newfilebằng cách : >/newfile.


Bạn cũng có thể đi theo touch /newfilecách tiếp cận thông thường , hoặc trên bash, một chuyển hướng trống - >/newfilecũng sẽ làm như vậy.

Chỉ cần lưu ý, nếu tệp đã tồn tại thì touchsẽ chỉ thay đổi dấu thời gian có liên quan mà không cắt bớt tệp. Và chuyển hướng trống >/newfilekhông được hỗ trợ trên tất cả các vỏ khi đang di chuyển (ví dụ: trong zsh), nơi bạn phải gửi EOF theo cách thủ công.


Làm gì :?
George Udosen

5
@George :là viết tắt cho true, đó là lệnh không hoạt động luôn thoát với trạng thái thoát 0.
heemayl

@heemayl Điều này hoạt động tốt nhất cho đến ngày hôm nay
Jacknife

6

Chỉ để cho vui:

python3 -c "if 'string' in open('logfile').read(): open('newfile', 'wt')"

trong đó 'string'được thay thế bằng chuỗi (điều kiện), 'logfile'được thay thế bằng đường dẫn đến logfile, 'newfile'được thay thế bằng đường dẫn thực tế đến tệp để tạo, tất cả trong dấu ngoặc đơn, ví dụ như trong ví dụ.


4

Bạn có thể sử dụng awk với system()lệnh của nó . Nếu /pattern/tìm thấy, codeblock {}sẽ được thực thi, trong trường hợp này chúng ta gọi touch /tmp/my_file.txtthông qua system()lệnh.

Ví dụ dưới đây cho thấy việc tạo một tệp tạm thời nếu có người dùng của tôi hiện diện /etc/passwd.

$ awk '/xieerqi/{system("touch /tmp/my_file.txt")}' /etc/passwd

$ ls -l /tmp/my_file.txt
-rw-rw-r-- 1 xieerqi xieerqi 0 1月  25 07:58 /tmp/my_file.txt

Ngoài ra, chúng tôi có thể sử dụng chuyển hướng để tập tin:

 awk '/xieerqi/{f="/tmp/my_file.txt";print "" > f;close(f)}' /etc/passwd 

0

Bạn không nói liệu bạn muốn một tệp trống mới hay nếu bạn cần xử lý phức tạp hơn để tạo tệp.

Nếu trước đây, trả lời của @heemayl là tại chỗ.

Mặt khác, sử dụng câu lệnh if:

if grep -q 'search_pattern' /file
then
    # Create your file here
fi
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.