Mari kita anggap ada perintah seperti:
cat /boot/config-3.19.0-32-generic | grep CONFIG_ARCH_DEFCONFIG
Outputnya seperti itu:
CONFIG_ARCH_DEFCONFIG="arch/x86/configs/x86_64_defconfig"
Sekarang, pertanyaan saya adalah: Apakah ada perintah yang hanya akan mencetak apa yang ada di dalam koma terbalik, yaitu " "
,?
Dan bisakah Anda menjelaskan sedikit perintahnya? Terima kasih! terlebih dahulu.
command-line
text-processing
Raphael
sumber
sumber
cat
pipa hampir selalu merupakan pemborosan sumber daya (AKA UUOC );grep
dapat membaca inputnya dari file yang sudah (yaitugrep CONFIG_ARCH_DEFCONFIG /boot/config-3.19.0-32-generic
melakukan hal yang persis sama, tetapi 1. Ini lebih pendek 2. Lebih mudah untuk memahami 3. Tidak membayar shell tambahan dan proses tambahan). Dalam 99% kasus, menggunakan cat di awal pipa tanpa menyatukan beberapa file itu hanya berbahaya. :)cat
, meskipun tidak berguna dalam kasus ini, akan membuat pengeditan seluruh baris perintah lebih mudah di masa depan jika Anda ingin mengubah / menambah / menghapus sesuatu nanti, mungkin atr
ataucut
, dll, tidak harus menemukan & memindahkan nama file , pastikan perintah lain mendukungnya, temukan di mana meletakkannya, dll. Dan untuk file uji kecil itu hanya menambahkan 0,002s. (Saya mungkin menghabiskan lebih banyak waktu mengetik ini daripada yang pernah saya hemat seumur hidup untuk menghindari yang berlebihancat
)cat
bantuan di sini? Anda dapat melakukannyagrep foo file | tr
atau... | cut
semudah itucat file | tr | grep ...
. Thecat
hanya menambah lima karakter tambahan, pipa tambahan dan panggilan Program tambahan dan tidak apa-apa menyederhanakan.Jawaban:
Ya, Anda bisa melakukannya. Perintah Anda adalah:
yang hanya akan mengembalikan:
The
awk
perintah menggunakan pemisah lapangan dengan-F
perintah, dan mengaturnya untuk menggunakan tanda kutip ganda, Anda ketik dengan tanda kutip tunggal di sekitarnya seperti-F'"'
. Kemudian'{print $2}'
memberitahu awk untuk mencetak set kedua setelah pemisah bidang.Semoga ini membantu!
sumber
cat
dangrep
. Anda dapat mengganticat
dangrep
berpisah denganawk -F'"' '/CONFIG_ARCH_DEFCONFIG/{print $2}' /boot/config-3.19.0-32-generic
. Lebih sedikit plumbing, membiarkan AWK melakukan semua pekerjaan, yang lebih dari mampu dilakukannyaawk
perintah. =)Anda dapat melakukannya dengan satu
grep
perintah:Atau (sedikit lebih lama dan lebih ramah):
-P
: memberitahugrep
untuk menginterpretasikan pola sebagai PCRE (Perl Compatible Regular Expression);-o
: memberitahugrep
untuk mencetak hanya kecocokan;^CONFIG_ARCH_DEFCONFIG="
: cocok denganCONFIG_ARCH_DEFCONFIG="
string di awal baris;\K
: membuang substring yang sebelumnya cocok;# 1:
[^"]*
: cocok dengan jumlah karakter apa pun yang tidak"
(serakah).# 2:
.*?
: cocok dengan sejumlah karakter apa pun (malas);(?=")
: lookahead (pernyataan nol panjang, tidak cocok dengan karakter apa pun); cocok jika karakter berikut adalah a"
.sumber
Ada banyak cara untuk menguliti kucing ini, berikut
sed
caranya:Di sini kita mencocokkan garis dan menangkap bagian yang diinginkan yaitu bagian dalam tanda kutip ganda (
([^"]+)
) dan kemudian mengganti seluruh baris dengan kelompok yang ditangkap (\1
) saja.Contoh:
sumber
Apa tidak
perl
?Surat
perl
wasiat akan-p
membatalkan setiap baris setelah menerapkan skrip yang diberikan oleh-e
. Surats/foo/bar/
wasiat akan digantifoo
denganbar
. Pola dalam tanda kurung "ditangkap" dan dapat disebut sebagai$1
,$2
... di$N
mana$1
pola pertama ditangkap,$2
yang kedua dll. Ekspresi reguler akan mencari semuanya sampai kutipan pertama (.*?"
), lalu ambil 0 atau lebih non-"
karakter ([^"]*
) dan semuanya. Semuanya diganti dengan pola yang diambil.Anda juga dapat membiarkan pencocokan pola ke
perl
:sumber
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]
Berikut adalah kombinasi dari
grep
dancut
, yang melakukan pekerjaan yang sama.Penjelasan:
grep "CONFIG_ARCH_DEFCONFIG" /boot/config-3.19.0-32-generic
adalah bagian yang menemukan garis, dalam sintaks grep standar:grep [OPTIONS] PATTERN [FILE...]
. Output melewati pipa ke tahap berikutnyacut -d"\"" -f2
. Bagian ini menggunakan memotong untuk memotong teks yang dipisahkan oleh pembatas khusus (yang ditentukan dengan-d
bendera). Kita harus menghindari kutip ganda dengan backslash sehingga shell memungkinkan mengambil kutip ganda sebagai salah satu opsi untukcut
perintah, daripada input ke shell itu sendiri. Sekarangcut
akan memperlakukan keluaran darigrep
yang dipisahkan oleh"
dan dibagi menjadi tiga kolom,CONFIG_ARCH_DEFCONFIG
,arch/x86/configs/x86_64_defconfig
, dan ruang kosong. Baris yang kita butuhkan adalah kolom kedua, itu artinya kita perlu menggunakan-f2
flag.sumber
Karena saya sedang belajar di
python
sini adalah versi menggunakan hal itu.Contoh dijalankan:
sumber
line.startswith
karenare.match
jauh lebih lambat daripadastartswith