Kabukta, belirli bir sütuna ihtiyacım olduğunda awk'a gidiyorum.
Bu, sütun 9'u yazdırır, örneğin:
... | awk '{print $9}'
Awk'a sadece 9. sütunu değil, 9. sütunu da içeren ve sonraki tüm sütunları yazdırmasını nasıl söyleyebilirim ?
Yanıtlar:
awk '{ s = ""; for (i = 9; i <= NF; i++) s = s $i " "; print s }'
awk -v N=9 '{sep=""; for (i=N; i<=NF; i++) {printf("%s%s",sep,$i); sep=OFS}; printf("\n")}'
cut
ya perl
bunun için. Bunu yalnızca içeri almakta gerçekten ısrar ediyorsanız kullanın awk
.
Bir dizi alan yapmak istediğinizde, bunu yapmanın awk
gerçekten kolay bir yolu yoktur. Bunun cut
yerine şunu tavsiye ederim :
cut -d' ' -f 9- ./infile
Varsayılan sekme olması nedeniyle alan alanı sınırlayıcı eklendi. Glenn'e bunu işaret ettiği için teşekkürler
find . | xargs ls -l | cut -d' ' -f 9-
. Bazı nedenlerden dolayı çift boşluklar da sayılır. Örnek: lrwxrwxrwx 1 me me 21 Dec 12 00:00 ./file_a lrwxrwxrwx 1 me me 64 Dec 6 00:06 ./file_b
sonuçlanacak./file_a 00:06 ./file_b
awk '{print substr($0, index($0,$9))}'
Düzenleme : Not, dokuzuncudan önceki herhangi bir alan dokuzuncuyla aynı değeri içeriyorsa bu çalışmaz.
sed -re 's,\s+, ,g' | cut -d ' ' -f 9-
Değişken genişlikteki boşluklarla uğraşmak yerine, tüm boşlukları tek boşluk olarak değiştirin. Ardından cut
ilgi alanlarıyla birlikte basit kullanın .
Awk kullanmıyor, bu yüzden alakalı değil ama diğer cevaplar / yorumlar göz önüne alındığında uygun görünüyordu.
ps faux |
kullanım için idealdir . XYZ aracını kabul etmekten asla korkmayın, en uygun araç değildir.
Genellikle perl awk / sed / grep et'in yerini alır. al. ve çok daha taşınabilir (aynı zamanda daha iyi bir çakı olduğu gibi).
perl -lane 'print "@F[8..$#F]"'
Elbette Timtowtdi geçerlidir.
-l
eklemeniz veya \n
print ifadesine eklemeniz gerekir.
awk -v m="\x01" -v N="3" '{$N=m$N ;print substr($0, index($0,m)+1)}'
Bu, verilen alan N'den önce olanı keser ve Nr alanı da dahil olmak üzere satırın geri kalanının tamamını yazdırır ve orijinal aralığı korur (yeniden biçimlendirmez). Alan dizisinin satırın başka bir yerinde de görünmesi önemli değildir, bu Ascherer'in cevabındaki problemdir.
Bir işlev tanımlayın:
fromField () {
awk -v m="\x01" -v N="$1" '{$N=m$N; print substr($0,index($0,m)+1)}'
}
Ve bunu şu şekilde kullanın:
$ echo " bat bi iru lau bost " | fromField 3
iru lau bost
$ echo " bat bi iru lau bost " | fromField 2
bi iru lau bost
Çıktı, sondaki boşluklar dahil her şeyi korur N = 0 için tüm satırı olduğu gibi döndürür ve n> NF için boş dizeyi döndürür
İşte bir ls -l
çıktı örneği :
-rwxr-----@ 1 ricky.john 1493847943 5610048 Apr 16 14:09 00-Welcome.mp4
-rwxr-----@ 1 ricky.john 1493847943 27862521 Apr 16 14:09 01-Hello World.mp4
-rwxr-----@ 1 ricky.john 1493847943 21262056 Apr 16 14:09 02-Typical Go Directory Structure.mp4
-rwxr-----@ 1 ricky.john 1493847943 10627144 Apr 16 14:09 03-Where to Get Help.mp4
Baskı şey yazılan Benim çözüm $9
olduğunuawk '{print substr($0, 61, 50)}'
İlk 3 alanı görüntülemek ve kullanabileceğiniz kalan alanları yazdırmak için:
awk '{s = ""; for (i=4; i<= NF; i++) s= s $i : "; print $1 $2 $3 s}' filename
$ 1 $ 2 $ 3 ilk 3 alandır.
Awk yerine cut kullanmak ve -c karakter kesme komutunu kullanarak hangi sütundan başlayacağınızı bulmakla ilgili sorunları aşmak.
Burada diyorum ki, çıktının ilk 49 karakteri dışında hepsini ver.
ls -l /some/path/*/* | cut -c 50-
/*/*/
Ls komutunun sonunda çok alt dizinleri içinde ne göstermek beni söylüyor.
Ayrıca belirli karakter aralıklarını ala (cut man sayfasından) da çıkarabilirsiniz. Örneğin, şu anda oturum açmış kullanıcıların adlarını ve oturum açma saatlerini gösterin:
who | cut -c 1-16,26-38