grep thay đổi dấu phân cách


12

bất kỳ cách nào chúng ta có thể thay đổi dấu phân cách sử dụng grep?

Tôi nghĩ, theo mặc định, grep sử dụng \nnhư là dấu phân cách.


Điều này nghe có vẻ phù hợp hơn trên SuperUser.com
Mitch Dempsey

Đọc trang hướng dẫn, xem có lựa chọn nào như vậy không (không, tôi không tin là có).
Cascabel

Tôi đã đọc nó. và không, không có lựa chọn nào

@jhon: Sau đó, đừng hỏi làm thế nào để thay đổi grep, hãy hỏi làm thế nào để làm những gì bạn muốn làm với một cái gì đó khác. Ví dụ: bạn có thể chỉ định dấu tách bản ghi trong perl ( $/) và awk ( RS). Hoặc bạn có thể làm một cái gì đó như echo "$var" | sed 's/<delimiter>/\n/' | grep <pattern>. Nhiều câu trả lời, tùy thuộc vào vấn đề thực tế của bạn là gì.
Cascabel

Câu trả lời:


2

Bạn chỉ quan tâm đến đầu ra, trcó thể làm việc cho bạn:

che@nok ~ $ grep cpu /proc/cpuinfo | tr '\n' ';'
cpu family      : 6;cpu MHz             : 800.000;cpu cores     : 2;cpuid level : 10;cpu family : 6;cpu MHz : 800.000;cpu cores      : 2;cpuid level : 10;

Trên thực tế, tôi có một kho dữ liệu như thế này, được lưu trữ bên trong một biến: một cái gì đó xxxxx yyyyyy @ aaaaaaaaa bbbbb @ asdasd @ asdsda @ asds ... @ vì vậy, tôi đã đoán được nếu có thể: echo $ my_var | grep "cái gì đó" này hoạt động, nhưng không như tôi muốn, grep lấy bó dữ liệu thành một dòng duy nhất, đó là lý do tại sao tôi muốn thay đổi nó thành một ký tự cụ thể (ở đây là '@')

Sau đó, bạn có thể thử đặt nó như thế này:echo $my_var | tr @ '\n' | grep blahblah
che

Tôi đã thực hiện nó, nhưng, dường như cái vỏ đang "cố gắng" thực thi nội dung: S

2
Bạn phải trích dẫn biến $my varđể bảo toàn khoảng trắng và dòng mới, tức là echo "$my_var" | ....
mrucci

1

agreptừ Đại học Arizona cho phép bạn thiết lập dấu phân cách. Đây không phải là sự thay thế thả xuống cho grep; nó sử dụng một thuật toán khác (grep gần đúng, có thể khớp với các lỗi) và có cú pháp mẫu khác nhau. Nhưng nó là một công cụ tiện dụng.

Thật không may, tôi nghĩ vì vấn đề cấp phép, đã có nhiều dự án tương tự được gọi agrepvà chúng không tương thích với nhau. Nhưng tôi nghĩ rằng tất cả các phiên bản cho phép bạn thiết lập một dấu phân cách.


1
case $# in
0|1|2)  cat >&2 <<EOF
    Usage: $0 delimiterstring pattern files....
    Behaves like grep -pdelimiterstring but on linux
    DOES NOT SUPPORT MOST ARGUMENTS
    unlike grep -p - leaves delimiterstring in output

    NO -p just the delimeterstring
    note: delimiterstring has to work in the sed command where the ${d} is
    if you are going to use @ in the delimeter string, then the @'s
    need to be replaced by someother character

EOF
    exit 0
;;
3)  mode=one ;;
*)  mode=many ;;
esac
d="${1}"
p="${2}"
shift 2
while [ $# -gt 1 ]
do
    sed "s@${d}@\x00@g" "${1}" | grep -z  "${p}" -  | (
        case $mode in 
        many) sed -e "s@\x00@${d}@g"  -e "s@^@${1}: @" ;;
        *)    sed -e "s@\x00@${d}@g"  ;;
        esac
    )
    shift
done

1
(1) Trong khi điều này có thể giải quyết vấn đề, chúng tôi thích câu trả lời để có thêm một chút giải thích. Ví dụ, có bất kỳ lý do thực sự để nói d="${1}"thay vì chỉ d="$1"? (2) Bạn cần mở rộng cảnh báo của mình: Nếu điều này được sử dụng với nhiều tệp, bạn cũng gặp vấn đề nếu bất kỳ tên tệp nào chứa `@ '. (3) (Chọn Nit) Một trình giả lập / trình giả lập thực sự cũng sẽ hoạt động với các đối số tệp không.
Scott

1

Thay thế dấu phân cách bằng không ('@') bằng một dòng mới (\ n) trước grep:

tập tin mèo | tr '\ 00' '\ n' | grep "chuỗi tìm kiếm"


0

Cái này thế nào Bất kỳ sử dụng?

tệp grep "chuỗi tìm kiếm" | awk 'BEGIN {RS = "\ n"; ORS = "@"} {print}'

Đặt '@' thành bất cứ điều gì phù hợp với nhu cầu của bạn.

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.