Aşağıdaki komut verildiğinde:
echo "1: " | awk '/1/ -F ":" {print $1}'
awk çıkışı neden:
1:
Aşağıdaki komut verildiğinde:
echo "1: " | awk '/1/ -F ":" {print $1}'
awk çıkışı neden:
1:
Yanıtlar:
"-F", awk sözdizimi olmayan bir komut satırı bağımsız değişkenidir, şunu deneyin:
echo "1: " | awk -F ":" '/1/ {print $1}'
(pattern){action}
. Eğer pattern
(çoğunlukla bir koşullu önerme) 'dir doğrudur , action
yürütülür. Eğer pattern
mevcut değildir, true
ima edilir. İşte pattern
olan /1/
devletler hangi regex olan 1
cari kayıt eşleşen$0
Programlı olarak yapmak istiyorsanız, FS
değişkeni kullanabilirsiniz :
echo "1: " | awk 'BEGIN { FS=":" } /1/ { print $1 }'
Döngü yerine ana döngüde değiştirirseniz , geçerli satır zaten bölünmüş olduğundan, okunan sonraki satır BEGIN
için etkili olacağını unutmayın .
:
Ayırıcı olarak ayarlamanın birden çok yolu vardır :
awk -F: '{print $1}'
awk -v FS=: '{print $1}'
awk '{print $1}' FS=:
awk 'BEGIN{FS=":"} {print $1}'
Hepsi eşdeğerdir ve 1
"1: 2: 3" örnek girişi için bir geri dönüş sağlar:
$ 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
ifadesi ile son örnek (genel awk
sözdizimi ile tutarlı olmak) en doğru olacağını varsayalım .
BEGIN
şeyi saklamak için bir dosya kullanırsam -F
, tek gömlekli kullanışlı olur.
awk 'BEGIN{print split("foo:bar",a)}' FS=":" file
veawk 'BEGIN{FS=":"; print split("foo:bar",a)}' file
Bu kadar yazmaya gerek yok. İstediğiniz alan ayırıcısını awk komutunda -F seçeneğiyle ve yazdırmak istediğiniz sütun numarasını belirtilen alan ayırıcısına göre koyun.
echo "1: " | awk -F: '{print $1}'
1
echo "1#2" | awk -F# '{print $1}'
1
AWK metin tercüman olarak çalışan tüm belge için linewise gider ve her hat için fieldwise gider her satırın alanlara böylece $ 1, $ 2 .. $ n referanslar (1 $ ilk alandır, $ 2 ikinci alan ve çok açık ...). Komut satırının altındaki "-F" anahtarını kullanarak veya "FS = ..." ile iki parantez içinde bir alan ayırıcı tanımlayabilirsiniz. Şimdi "JUERGEN" cevabını düşünün:
echo "1: " | awk -F ":" '/1/ {print $1}'
Alan sınırları ":" ile ayarlanır, bu nedenle boş alan olan "1" ve $ 2 olmak üzere iki alanımız vardır. Daha sonra, filtreye yalnızca ilk alanı çıkarmasını bildiren "/ 1 /" normal ifadesi gelir yorumlayıcı böyle bir ifadeyi içeren bir çizgi üzerinde tökezlediğinde (i 1 demek); "Echo" komutunun çıktısı "1" içeren bir satırdır, böylece filtre çalışır ...
Aşağıdaki örnekle uğraşırken:
echo "1: " | awk '/1/ -F ":" {print $1}'
Sözdizimi dağınık ve yorumlayıcı F ":" bölümünü yok saymayı seçti ve boş alan olan varsayılan alan ayırıcıya geçerek birinci alan olarak "1:" çıktısını alıyor ve ikinci bir alan olmayacak!
JUERGEN'in cevabı iyi sözdizimini içeriyor ...