Saya memiliki file yang berisi baris-baris berikut:
/logs/tc0001/tomcat/tomcat7.1/conf/catalina.properties:app.env.server.name = demo.example.com
/logs/tc0001/tomcat/tomcat7.2/conf/catalina.properties:app.env.server.name = quest.example.com
/logs/tc0001/tomcat/tomcat7.5/conf/catalina.properties:app.env.server.name = www.example.com
Dalam output di atas saya ingin mengekstrak 3 bidang (Nomor 2, 4 dan yang terakhir *.example.com
). Saya mendapatkan output berikut:
cat file | awk -F'/' '{print $3 "\t" $5}'
tc0001 tomcat7.1
tc0001 tomcat7.2
tc0001 tomcat7.5
Bagaimana saya juga mengekstrak bidang terakhir dengan nama domain yang setelahnya '='
? Bagaimana cara saya multiple delimiter
mengekstrak bidang?
awk
command-line
text-processing
Satish
sumber
sumber
awk
menelan bidang ketika mereka kosong yang membentuk penomoran bidang. Saya berubah-F " "
menjadi-F "[ ]"
danawk
tidak menelan ladang kosong lagi.Jawaban:
Pembatas dapat berupa ekspresi reguler.
Menghasilkan:
sumber
cat
proses tidak diperlukan:awk '...' file
. Juga, akan lebih rapi untuk menggunakan pemisah bidang keluaran:awk -F'[/=]' -v OFS="\t" '{print $3, $5, $8}'
|
: ex:awk -F 'this|that|[=/]' '......'
(berguna untuk membuat kata-kata / string memisahkan hal-hal) (perhatikan bahwa ini membuat ruang-ruang di fiels merasa antara 2 pemisah. Menambahkan juga|[ \t]+
dapat berguna, tetapi dapat membuat hal-hal rumit ... karena sering ada spasi sebelum dan sesudah 'ini', ini akan membuat 2 bidang kosong ekstra muncul di antara ruang-ruang dan 'ini')Kabar baik!
awk
pemisah bidang dapat berupa ekspresi reguler. Anda hanya perlu menggunakan-F"<separator1>|<separator2>|..."
:Pengembalian:
Sini:
-F"/|="
mengatur pemisah bidang input ke salah satu/
atau=
. Kemudian, ini mengatur pemisah bidang keluaran ke sebuah tab.-vOFS='\t'
menggunakan-v
bendera untuk mengatur variabel.OFS
adalah variabel default untuk Pemisah Bidang Output dan disetel ke karakter tab. Bendera diperlukan karena tidak ada bawaan untuk OFS seperti-F
.{print $3, $5, $NF}
mencetak bidang ke-3, ke-5 dan terakhir berdasarkan pemisah bidang input.Lihat contoh lain:
File ini memiliki dua bidang pemisah,
#
dan_
. Jika kita ingin mencetak kolom kedua terlepas dari apakah separatornya satu atau yang lain, mari kita menjadikan keduanya pemisah!Di mana file diberi nomor sebagai berikut:
sumber
Jika spasi putih Anda konsisten, Anda bisa menggunakannya sebagai pembatas, dan bukannya memasukkan
\t
secara langsung, Anda bisa mengatur pemisah output dan itu akan disertakan secara otomatis:sumber
Untuk pemisah bidang nomor apa pun
2
melalui5
atau hurufa
atau#
atau spasi, di mana karakter pemisah harus diulang setidaknya 2 kali dan tidak lebih dari 6 kali, misalnya:Saya yakin variasi ini ada menggunakan () dan parameter
sumber
Perl one-liner:
Opsi baris perintah ini digunakan:
-n
loop di sekitar setiap baris dari file input, letakkan baris dalam$_
variabel, jangan otomatis mencetak setiap baris-l
menghapus baris baru sebelum diproses, dan menambahkannya kembali sesudahnya-a
mode autosplit - perl secara otomatis akan membagi jalur input ke dalam@F
array. Default untuk memisahkan di whitespace-F
pengubah autosplit, dalam contoh ini terbagi menjadi salah satu/
atau=
-e
jalankan kode perlPerl terkait erat dengan awk, namun,
@F
array autosplit dimulai pada indeks$F[0]
sementara bidang awk mulai dengan $ 1.sumber
Yang lain adalah dengan menggunakan opsi -F tetapi meneruskannya regex untuk mencetak teks antara kurung kiri dan atau kanan
()
.Konten file:
Perintah:
hasil:
Menggunakan awk untuk hanya mencetak teks di antara
[]
:Gunakan
awk -F'[][]'
tetapiawk -F'[[]]'
tidak akan berfungsi.http://stanlo45.blogspot.com/2020/06/awk-multiple-field-separators.html
sumber
Saya melihat banyak jawaban sempurna ada di papan tulis, tetapi masih ingin mengunggah kode saya juga,
awk -F"/" '{print $3 " " $5 " " $7}' sam | sed 's/ cat.* =//g'
sumber
print $3 " " $5 " " $7
dapat dicetak sama sepertiprint $3, $5, $7
. Juga, saya tidak melihat keuntungan menggunakan awk dan kemudian mem-pip ke sed. Secara umum, awk dapat mencukupi dan yang lainnya menjawab menunjukkan itu.