In một phần cụ thể trong một đầu ra


11

Chúng ta hãy giả sử rằng có một lệnh như:

cat /boot/config-3.19.0-32-generic | grep CONFIG_ARCH_DEFCONFIG

Đầu ra là như vậy:

CONFIG_ARCH_DEFCONFIG="arch/x86/configs/x86_64_defconfig"

Bây giờ, câu hỏi của tôi là: Có bất kỳ lệnh nào sẽ chỉ in những gì bên trong dấu phẩy ngược, nghĩa là " "?

Và bạn có thể vui lòng giải thích lệnh một chút? Cảm ơn bạn! trước.


5
Lưu ý rằng việc sử dụng cattrong đường ống hầu như luôn lãng phí tài nguyên (AKA UUOC ); grepcó thể đọc dữ liệu đầu vào từ một tệp đã có (nghĩa là grep CONFIG_ARCH_DEFCONFIG /boot/config-3.19.0-32-genericthực hiện chính xác điều tương tự, nhưng 1. Nó ngắn hơn 2. Dễ hiểu hơn 3. Nó không rẽ nhánh một vỏ bổ sung và một quy trình bổ sung). Trong 99% trường hợp, sử dụng mèo khi bắt đầu đường ống mà không ghép nhiều tệp, điều đó chỉ có hại. :)
kos

@kos - Thanx! Không biết rằng tôi mới bắt đầu sử dụng linux. Sẽ ghi nhớ nó.
Raphael

Np! Tôi đang để lại bình luận của tôi ở trên cho những người khác vấp phải câu hỏi này.
kos

Ban đầu cat, mặc dù vô dụng trong trường hợp này, sẽ giúp chỉnh sửa toàn bộ dòng lệnh trong tương lai dễ dàng hơn trong trường hợp bạn muốn thay đổi / thêm / xóa thứ gì đó sau này, có thể , trhoặc cut, v.v., không phải tìm và di chuyển tên tệp , đảm bảo lệnh khác hỗ trợ nó, tìm vị trí đặt nó, v.v. Và đối với một tệp thử nghiệm nhỏ, nó chỉ thêm 0,002s. (Có lẽ tôi đã dành nhiều thời gian để gõ cái này hơn là tôi sẽ tiết kiệm trong suốt cuộc đời để tránh những thứ không cần thiết cat)
Xen2050

1
@ Xen2050 tại sao sự catgiúp đỡ ở đây? Bạn có thể làm grep foo file | trhoặc ... | cutchỉ dễ dàng như cat file | tr | grep .... Chỉ catcần thêm năm ký tự, một đường ống thêm và một cuộc gọi chương trình bổ sung và không đơn giản hóa bất cứ điều gì.
terdon

Câu trả lời:


15

Đúng, bạn có thể làm điều đó. Lệnh của bạn sẽ là:

cat /boot/config-3.19.0-32-generic | grep CONFIG_ARCH_DEFCONFIG | awk -F'"' '{print $2}'

sẽ chỉ trả lại:

arch/x86/configs/x86_64_defconfig

Các awklệnh sử dụng dải phân cách lĩnh vực với các -Flệnh, và để thiết lập nó để sử dụng hai dấu ngoặc kép, bạn gõ vào với đơn dấu ngoặc kép quanh nó như -F'"'. Sau đó, báo '{print $2}'awk sẽ in tập thứ hai sau dấu phân cách trường.

Hi vọng điêu nay co ich!


14
@Terrance, Trong trường hợp này, đây là một cách sử dụng catgrep. Bạn có thể thay thế catgrepmột phần với awk -F'"' '/CONFIG_ARCH_DEFCONFIG/{print $2}' /boot/config-3.19.0-32-generic . Ít hệ thống ống nước hơn, hãy để AWK làm tất cả công việc, điều đó nhiều hơn khả năng thực hiện
Sergiy Kolodyazhnyy

Đồng ý với @Serg
Tung Tran

@Serg Không có vấn đề. Tôi hiểu những gì bạn đang nói. Tôi chỉ thêm vào lệnh ban đầu của anh ấy bằng cách thêm vào awklệnh. =)
Terrance

11

Bạn có thể làm điều đó với một greplệnh duy nhất :

grep -Po '^CONFIG_ARCH_DEFCONFIG="\K[^"]*' /boot/config-3.19.0-32-generic

Hoặc (dài hơn một chút và phức tạp hơn):

grep -Po '^CONFIG_ARCH_DEFCONFIG="\K.*?(?=")' /boot/config-3.19.0-32-generic
  • -P: nói grepđể diễn giải mẫu dưới dạng PCRE (Biểu thức chính quy tương thích Perl);
  • -o: bảo grepchỉ in trận đấu;
  • ^CONFIG_ARCH_DEFCONFIG=": khớp với một CONFIG_ARCH_DEFCONFIG="chuỗi ở đầu dòng;
  • \K: loại bỏ chuỗi con phù hợp trước đó;

# 1:

  • [^"]*: phù hợp với bất kỳ số lượng của bất kỳ nhân vật nào không "(tham lam).

# 2:

  • .*?: phù hợp với bất kỳ số lượng của bất kỳ nhân vật (lười biếng);
  • (?="): lookahead (khẳng định không có chiều dài, nó không khớp với bất kỳ ký tự nào); phù hợp nếu ký tự sau là a ".
% grep -Po '^CONFIG_ARCH_DEFCONFIG="\K[^"]*' /boot/config-4.2.0-16-generic
arch/x86/configs/x86_64_defconfig
% grep -Po '^CONFIG_ARCH_DEFCONFIG="\K.*?(?=")' /boot/config-4.2.0-16-generic
arch/x86/configs/x86_64_defconfig

Tôi thích học nhiều hơn một cách để đạt được kết quả tương tự. Câu trả lời chính xác! =)
Terrance

10

Có nhiều cách để làm da con mèo này, đây là một sedcách:

sed -nr 's/^CONFIG_ARCH_DEFCONFIG="([^"]+)"$/\1/p' /boot/config-3.19.0-32-generic

Ở đây chúng tôi đang khớp dòng và chụp phần mong muốn, tức là phần trong dấu ngoặc kép ( ([^"]+)) và sau đó chỉ thay thế toàn bộ dòng bằng nhóm đã chụp ( \1).

Thí dụ:

% sed -nr 's/^CONFIG_ARCH_DEFCONFIG="([^"]+)"$/\1/p' /boot/config-3.13.0-32-generic
arch/x86/configs/x86_64_defconfig

10

Gì, không có perl?

grep CONFIG_ARCH_DEFCONFIG /boot/config-3.19.0-32-generic | 
    perl -pe 's/.*?"([^"]*).*/$1/'

Ý perlchí sẽ -print mỗi dòng sau khi áp dụng kịch bản được đưa ra bởi -e. Các s/foo/bar/sẽ thay thế foovới bar. Patterns trong ngoặc đơn được "bắt" và có thể được gọi là $1, $2... $Nnơi $1là mô hình 1 bắt, $2thứ hai, vv Các biểu thức chính quy sẽ tìm kiếm tất cả mọi thứ cho đến khi trích dẫn đầu tiên ( .*?"), sau đó chụp 0 hoặc không nhiều "ký tự ( [^"]*) và sau đó mọi thứ khác. Toàn bộ điều được thay thế bằng các mẫu đã chụp.

Bạn cũng có thể để mẫu phù hợp với perl:

perl -ne 's/.*CONFIG_ARCH_DEFCONFIG="([^"]*).*/$1/ && print' /boot/config-3.19.0-32-generic

2
Tôi biết bạn sẽ tham gia vào một lúc nào đó: P +1
heemayl

sau đó tôi sẽ tạo ra một mã trăn ..
Avinash Raj

with open('/boot/config-3.19.0-32-generic') as f: for line in f: if line.startswith('CONFIG_ARCH_DEFCONFIG'): print line.split('"')[1]
Avinash Raj

@AvinashRaj thứ tốt, quan tâm để gửi bài này xin vui lòng? Tôi cũng đã đăng một cái với regex.
Sergiy Kolodyazhnyy

8

Đây là một sự kết hợp của grepcut, đó là công việc tương tự.

$ grep "CONFIG_ARCH_DEFCONFIG" /boot/config-3.19.0-32-generic | cut -d"\"" -f2                                                
arch/x86/configs/x86_64_defconfig

Giải trình:

  • grep "CONFIG_ARCH_DEFCONFIG" /boot/config-3.19.0-32-genericlà phần tìm thấy dòng, trong cú pháp grep tiêu chuẩn : grep [OPTIONS] PATTERN [FILE...]. Đầu ra đi qua đường ống đến giai đoạn tiếp theo
  • cut -d"\"" -f2. Phần này sử dụng cắt để cắt xén văn bản được phân tách bằng dấu phân cách cụ thể (được chỉ định bằng -dcờ). Chúng ta phải thoát dấu ngoặc kép bằng dấu gạch chéo ngược để shell cho phép lấy trích dẫn kép làm một trong các tùy chọn cho cutlệnh, thay vì nhập vào chính shell. Bây giờ cutsẽ đối xử với sản lượng từ grepnhư phân cách bằng "và chia thành ba cột, CONFIG_ARCH_DEFCONFIG, arch/x86/configs/x86_64_defconfig, và không gian trống rỗng. Dòng chúng ta cần là cột thứ hai, có nghĩa là chúng ta cần sử dụng -f2cờ.

3

Vì tôi hiện đang học pythonở đây là một phiên bản sử dụng chính xác điều đó.

#!/usr/bin/env python
import re

reg = re.compile('CONFIG_ARCH_DEFCONFIG')

with open("/boot/config-3.19.0-32-generic") as file :
   for line in file:
       if reg.match(line):
           print line.split('"')[1]

Chạy mẫu:

DIR:/TECH-BOOKS
skolodya@ubuntu:$ ./extractString.py                                           
arch/x86/configs/x86_64_defconfig

DIR:/TECH-BOOKS
skolodya@ubuntu:$ cat ./extractString.py                                       
#!/usr/bin/env python
import re

reg = re.compile('CONFIG_ARCH_DEFCONFIG')

with open("/boot/config-3.19.0-32-generic") as file :
   for line in file:
       if reg.match(line):
           print line.split('"')[1]

thụt đầu dòng là rất quan trọng trong trăn ..
Avinash Raj

1
Bạn không cần phải dùng regexd, chỉ cần sử dụng của tôi, line.startswithre.matchnó chậm hơn nhiều so vớistartswith
Avinash Raj
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.