Diberikan perintah berikut:
echo "1: " | awk '/1/ -F ":" {print $1}'
mengapa output awk:
1:
Diberikan perintah berikut:
echo "1: " | awk '/1/ -F ":" {print $1}'
mengapa output awk:
1:
Jawaban:
"-F" adalah argumen baris perintah yang bukan awk sintaks, coba:
echo "1: " | awk -F ":" '/1/ {print $1}'
(pattern){action}
. Jika pattern
(kebanyakan pernyataan bersyarat) benar , action
dieksekusi. Jika pattern
tidak tersedia, true
tersirat. Di sini pattern
adalah /1/
negara yang 1
dicocokkan regex dalam catatan saat ini$0
Jika Anda ingin melakukannya secara terprogram, Anda dapat menggunakan FS
variabel:
echo "1: " | awk 'BEGIN { FS=":" } /1/ { print $1 }'
Perhatikan bahwa jika Anda mengubahnya di loop utama daripada BEGIN
loop, itu akan mempengaruhi baris berikutnya yang dibaca, karena baris saat ini telah terpecah.
Anda memiliki banyak cara untuk ditetapkan :
sebagai pemisah:
awk -F: '{print $1}'
awk -v FS=: '{print $1}'
awk '{print $1}' FS=:
awk 'BEGIN{FS=":"} {print $1}'
Semuanya setara dan untuk akan kembali 1
untuk input sampel "1: 2: 3":
$ awk -F: '{print $1}' <<< "1:2:3"
1
$ awk -v FS=: '{print $1}' <<< "1:2:3"
1
$ awk '{print $1}' FS=: <<< "1:2:3"
1
$ awk 'BEGIN{FS=":"} {print $1}' <<< "1:2:3"
1
BEGIN
pernyataan akan menjadi yang paling benar (konsisten dengan awk
sintaksis keseluruhan ).
BEGIN
jika saya menggunakan file untuk menyimpan semuanya, sementara -F
berguna dengan satu-liner.
awk 'BEGIN{print split("foo:bar",a)}' FS=":" file
danawk 'BEGIN{FS=":"; print split("foo:bar",a)}' file
Tidak Perlu banyak menulis ini. Masukkan saja pemisah bidang yang Anda inginkan dengan opsi -F di perintah awk dan nomor kolom yang ingin Anda cetak dipisahkan sesuai pemisah bidang yang Anda sebutkan.
echo "1: " | awk -F: '{print $1}'
1
echo "1#2" | awk -F# '{print $1}'
1
AWK berfungsi sebagai penerjemah teks yang berlaku secara linier untuk seluruh dokumen dan berlaku secara fieldwise untuk setiap baris sehingga $ 1, $ 2 .. $ n adalah referensi ke bidang masing-masing baris ($ 1 adalah bidang pertama, $ 2 adalah bidang kedua dan seterusnya ...). Anda dapat mendefinisikan pemisah bidang dengan menggunakan sakelar "-F" di bawah baris perintah atau dalam dua tanda kurung dengan "FS = ...". Sekarang pertimbangkan jawaban "JUERGEN":
echo "1: " | awk -F ":" '/1/ {print $1}'
Di atas batas bidang ditetapkan oleh ":" jadi kami memiliki dua bidang $ 1 yang merupakan "1" dan $ 2 yang merupakan ruang kosong. ketika penerjemah tersandung pada garis yang mengandung ungkapan seperti itu (maksud saya 1); Output dari perintah "echo" adalah satu baris yang berisi "1" sehingga filter akan berfungsi ...
Ketika berhadapan dengan contoh berikut:
echo "1: " | awk '/1/ -F ":" {print $1}'
Sintaksnya berantakan dan interpreter memilih untuk mengabaikan bagian F ":" dan beralih ke bidang splitter standar yang merupakan ruang kosong sehingga menghasilkan "1:" sebagai bidang pertama dan tidak akan ada bidang kedua!
Jawaban JUERGEN berisi sintaks yang baik ...