Saya butuh bantuan untuk mengetahui cara menggunakan perintah sed untuk hanya menampilkan kolom pertama dan kolom terakhir dalam file teks. Inilah yang saya miliki sejauh ini untuk kolom 1:
cat logfile | sed 's/\|/ /'|awk '{print $1}'
Upaya lemah saya untuk mendapatkan kolom terakhir untuk ditampilkan juga adalah:
cat logfile | sed 's/\|/ /'|awk '{print $1}{print $8}'
Namun ini mengambil kolom pertama dan kolom terakhir dan menggabungkannya bersama dalam satu daftar. Apakah ada cara untuk mencetak kolom pertama dan kolom terakhir dengan jelas dengan perintah sed dan awk?
Input sampel:
foo|dog|cat|mouse|lion|ox|tiger|bar
Jawaban:
Hampir sampai. Letakkan kedua referensi kolom di samping satu sama lain.
Perhatikan juga bahwa Anda tidak perlu di
cat
sini.Perhatikan juga Anda dapat memberi tahu
awk
bahwa pemisah kolom adalah|
, bukannya kosong, jadi Anda tidak perlused
melakukannya.Sesuai saran oleh Caleb , jika Anda menginginkan solusi yang masih menampilkan bidang terakhir, bahkan jika tidak ada delapan, Anda dapat menggunakan
$NF
.Juga, jika Anda ingin output mempertahankan
|
separator, alih-alih menggunakan spasi, Anda dapat menentukan pemisah bidang output. Sayangnya, ini sedikit lebih canggung daripada hanya menggunakan-F
bendera, tetapi di sini ada tiga pendekatan.Anda dapat menetapkan pemisah bidang input dan output dengan
awk
sendirinya, di blok BEGIN.Anda dapat menetapkan variabel-variabel ini saat menelepon
awk
dari baris perintah, melalui-v
flag.atau hanya:
sumber
|
sebagai pemisah keluaran daripada ruang default untuk penggabungan string. Anda juga bisa menjelaskan untuk menggunakan$NF
alih-alih pengodean keras$8
untuk mendapatkan kolom terakhir.Cukup ganti dari yang pertama hingga yang terakhir
|
dengan|
(atau spasi jika Anda mau):Perhatikan bahwa meskipun tidak ada
sed
implementasi|
yang spesial (selama ekspresi reguler yang diperluas tidak diaktifkan melalui-E
atau-r
dalam beberapa implementasi),\|
itu sendiri adalah spesial di beberapa seperti GNUsed
. Jadi Anda tidak harus melarikan diri|
jika Anda bermaksud untuk mencocokkan|
karakter.Jika mengganti dengan spasi dan jika input mungkin sudah berisi garis dengan hanya satu
|
, maka, Anda harus memperlakukannya secara khusus karena|.*|
tidak akan cocok dengan itu. Itu bisa:(yaitu menjadikan
.*|
bagian itu opsional) Atau:atau:
Jika Anda ingin bidang pertama dan kedelapan terlepas dari jumlah bidang dalam input, maka itu hanya:
(semua itu akan bekerja dengan utilitas yang sesuai POSIX dengan asumsi input berupa teks yang valid (khususnya,
sed
yang umumnya tidak akan berfungsi jika input memiliki byte atau urutan byte yang tidak membentuk karakter yang valid di lokal saat ini seperti misalnyaprintf 'unix|St\351phane|Chazelas\n' | sed 's/|.*|/|/'
di lokal UTF-8)).sumber
Anda
awk
tetap menggunakan :sumber
|
lebih banyak ruang) dengan-F\|
atau serupa? Juga bagaimana jika dia ingin menggunakan pembatas yang sama untuk output?Jika Anda mendapati diri Anda canggung dan sed-kurang, Anda dapat mencapai hal yang sama dengan coreutils:
sumber
cut
lebih bersih dan lebih kompak daripada awk / sed ketika Anda hanya tertarik pada kolom pertama, atau jika delimeter diperbaiki (yaitu bukan jumlah spasi variabel).Sepertinya Anda mencoba untuk mendapatkan bidang teks pertama dan terakhir yang dibatasi oleh
|
.Saya berasumsi file log Anda berisi teks seperti di bawah ini,
Dan Anda ingin output seperti,
Jika ya, maka inilah perintah untuk Anda
Melalui GNU sed,
Contoh:
sumber
Anda mungkin harus melakukannya dengan
sed
- saya akan tetap - tetapi, hanya karena belum ada yang menulis ini:KELUARAN
sumber