linux'ta bash takma adı olarak komut satırı kullanılırken hata oluştu


4

Aşağıdaki komut satırı sırasını bash takma adı olarak kaydetmek istiyorum:

grep  `date '+%d/%b/%Y'` access.logs  | egrep 2765330645ae47d292c9ceac725d744e.py |awk '{print $1, $4, $5, $7, $8, $9, $10}' | sort |uniq -c -w15 |sort -n

Komut satırından düzgün çalışıyor ancak takma ad olarak ayarlamayı denediğimde başarısız oluyor. .Bash_profile dosyasına şunu eklemeyi denedim:

alias downloads="grep  `date '+%d/%b/%Y'` access.logs  | egrep 2765330645ae47d292c9ceac725d744e.py |awk '{print $1, $4, $5, $7, $8, $9, $10}' | sort |uniq -c -w15 |sort -n"

ve aşağıdaki hataları alıyorum:

-bash-3.2$ downloads
awk: {print , , , , , , 0}
awk:        ^ syntax error
awk: {print , , , , , , 0}
awk:          ^ syntax error
awk: {print , , , , , , 0}
awk:            ^ syntax error
awk: {print , , , , , , 0}
awk:              ^ syntax error
awk: {print , , , , , , 0}
awk:                ^ syntax error
awk: {print , , , , , , 0}
awk:                  ^ syntax error

Neyi yanlış yapıyorum????

Yanıtlar:


5

Açıkçası, bir komut bir o kadar büyürken, bir diğer adı değil bir senaryo haline getirirdim. Bir komut dosyasının bir avantajı, onu yalnızca 'access.logs' öğesinden daha fazla dosyayla çalışmasını sağlamanızdır.

Bu komut sırası, her zaman eğlenceye katkıda bulunan hem tek tırnakları hem de geri tırnakları içerir. Genellikle, kullanmaktan daha iyisindir. $(command args) geri tırnak yerine.

Takma adın çevresindeki çift tırnak işaretlerini kullandığınızda, arkaya verilen komutlar takma ad oluşturulurken yürütülür - kabuk, takma adı tanımladıklarında farklı şeyleri yorumlama yolu yoksa Ayrıca, $var ifadeler çift tırnak işareti içinde değerlendirilir; awk hatalar, geçerli kabukta hiçbir argüman olmadığını gösteriyor.

Bu nedenle, bir takma ad kullanmanız gerekiyorsa, büyük olasılıkla tüm ifadenin etrafında tek tırnak işaretleri kullanmanız gerekir; artı ifadede görünen her bir teklif için, bunu alıntı-ters-sırala-alıntı dizisiyle değiştirin: '\''. İlk alıntı geçerli alıntılanan dizgeyi sonlandırır; ters eğik çizgi teklifi değişmez bir teklifi temsil eder; Son alıntı, alıntılanan dizgiyi yeniden başlatır.

Bu şuna sebebiyet verir:

alias downloads='grep  `date '\''+%d/%b/%Y'\''` access.logs |
                 egrep 2765330645ae47d292c9ceac725d744e.py |
                 awk '\''{print $1, $4, $5, $7, $8, $9, $10}'\'' |
                 sort | uniq -c -w15 | sort -n'

Bu harika bir tavsiye! Ayrıca bir bash işlevi de oluşturabilirsiniz, ancak aslında bir komut dosyası muhtemelen tercih edilir (en azından değişken kapsam belirleme amaçları için). İşlevler alt kabuklar tarafından miras alınmaz, ancak komut dosyaları yine de $ PATH aracılığıyla bulunabilir.
ericslaw

1
"İşlevler alt kabuklar tarafından miras alınmaz" - Fakat yapabilirsiniz export -f functionname
Dennis Williamson

6

Linux'ta biraz yeşilim, bu yüzden tam olarak neden işe yaramadığından emin değilim. Ancak bunun yerine bir işlev kullanabilirsiniz.

.Profile / .bashrc içinde yeni bir fonksiyon oluşturun:

downloads() { grep  `date '+%d/%b/%Y'` access.logs  | egrep 2765330645ae47d292c9ceac725d744e.py |awk '{print $1, $4, $5, $7, $8, $9, $10}' | sort |uniq -c -w15 |sort -n; }

Bu tam olarak bir takma ad gibi çalışır.


1
Ah! Nagul neden işe yaramadığını biliyor :)
A Dwarf

(+1) Bir işlev yerine bir takma ad tercih etmek için geçerli bir nedenim olmadığı sürece, bunu gerçekten tercih ederdim. Bu, diğer adın çıkış sürümünden daha temiz ve daha açıktır.
nagul

4

Diğer ad çift tırnak işaretleri içinde tanımlandığından tarih komut takma adın tanımlanması sırasında yürütülür ve $1 değişkenler de genişler. Tanımladıktan sonra takma adı arayarak bunu kontrol edebilirsiniz:

$ alias downloads="grep  `date '+%d/%b/%Y'` access.logs  | egrep 2765330645ae47d292c9ceac725d744e.py |awk '{print $1, $4, $5, $7, $8, $9, $10}' | sort |uniq -c -w15 |sort -n"
$ alias downloads
alias downloads='grep  27/Sep/2009 access.logs  | egrep 2765330645ae47d292c9ceac725d744e.py |awk '\''{print , , , , , , 0}'\'' | sort |uniq -c -w15 |sort -n'

Kaçarak bunu düzeltebilmelisin. tarih çağrı ve $1 değişkenler:

$ alias downloads="grep  \`date '+%d/%b/%Y'\` access.logs  | egrep 2765330645ae47d292c9ceac725d744e.py |awk '{print \$1, \$4, \$5, \$7, \$8, \$9, \$10}' | sort |uniq -c -w15 |sort -n"
$ alias downloads
alias downloads='grep  `date '\''+%d/%b/%Y'\''` access.logs  | egrep 2765330645ae47d292c9ceac725d744e.py |awk '\''{print $1, $4, $5, $7, $8, $9, $10}'\'' | sort |uniq -c -w15 |sort -n'

Bunu başarıyla çalıştırabiliyor musunuz kontrol edin. İdeal olarak, takma adı tek tırnak içinde tanımlarsınız, ancak takma adın içindeki tek tırnak işaretlerinin varlığı durumunuzu zorlaştırır.


3

Diğer bir değişiklik ise dış olanlar için tek tırnak kullanmak ve içlerinden kaçmak ve alıntı yapmaktır. Hangisini seçerseniz seçebilirsiniz (bu veya hangisi nagul en cevap) belirli bir durum için en çirkin sonucu yapar.

alias downloads='grep  $(date '\''+%d/%b/%Y'\'') access.logs  | egrep 2765330645ae47d292c9ceac725d744e.py |awk '\''{print $1, $4, $5, $7, $8, $9, $10}'\'' | sort |uniq -c -w15 |sort -n'

Muhtemelen bunun ne olduğunu göreceksiniz alias Tüm dolar işaretlerinden kaçarsanız, yine de yazdırılır.

Geri tepmeyi değiştirme özgürlüğüne kavuştum $() için okunabilirlik ve çok yönlülük .

Eğer kullanırsan nagul en yöntem (dış olanlar için çift tırnak dahil) ve $() geri tepmek yerine, kaçman gereken tek şey dolar işareti.

alias downloads="grep  \$(date '+%d/%b/%Y') access.logs  | egrep 2765330645ae47d292c9ceac725d744e.py |awk '{print \$1, \$4, \$5, \$7, \$8, \$9, \$10}' | sort |uniq -c -w15 |sort -n"

Bu hatırlanması kolay ve çok tutarlı bir yöntemdir.


0

Awk'den aldığınız değeri nasıl kullanır ve değişken olarak saklarsınız? Ben bununla başlıyorum.

alias xx2='xrandr | awk '\''$2=="connected"{s=$1} END{print s}'\'''

Yapmaya çalıştığım şey bu.

VAR=$(xrandr | awk '$2=="connected"{s=$1} END{print s}'); xrandr --output $VAR --mode 1024x768 --rate 60; xrandr --output LVDS1 --left-of $VAR; xrandr --output LVDS1 --primary; unset VAR;

Bu benim ilk fikrimdi. OMG'yi açmaya çalıştıktan sonra VAR'a herhangi bir değer vermediğini gördüm.

alias xx2='VAR=$(xrandr | awk '\''$2=="connected"{s=$1} END{print s}'\''); echo $VAR > OMG'

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.