Apakah ada cara untuk menentukan pembatas bidang untuk lebih banyak spasi dengan perintah cut? (seperti "" +)? Misalnya: Dalam string berikut, saya ingin mencapai nilai '3744', pembatas bidang apa yang harus saya katakan?
$ps axu | grep jboss
jboss 2574 0.0 0.0 3744 1092 ? S Aug17 0:00 /bin/sh /usr/java/jboss/bin/run.sh -c example.com -b 0.0.0.0
cut -d' '
bukan yang saya inginkan, karena itu hanya untuk satu ruang tunggal.
awk
bukan apa yang saya cari, tapi bagaimana hubungannya dengan 'cut'?
Terima kasih.
tr
seperti yang ditunjukkan di sini: stackoverflow.com/a/4483833/168143ps
+grep
Anda dapat menggunakanpgrep
yang tersedia di sebagian besar distro modern. Ini akan mengembalikan hasilnya persis dalam bentuk yang Anda butuhkan.Jawaban:
Sebenarnya
awk
adalah persis alat Anda harus melihat ke dalam:atau Anda dapat membuang
grep
semuanya karenaawk
tahu tentang ekspresi reguler:Tetapi jika, untuk alasan yang aneh, Anda benar - benar tidak dapat menggunakan
awk
, ada hal-hal sederhana lain yang dapat Anda lakukan, seperti jatuhkan semua spasi putih ke ruang tunggal terlebih dahulu:Itu
grep
trik, dengan cara, adalah cara yang rapi untuk hanya mendapatkanjboss
proses dan bukangrep jboss
satu (ditto untukawk
varian juga).The
grep
Proses akan memiliki literalgrep [j]boss
dalam perintah proses sehingga tidak akan tertangkap olehgrep
sendiri, yang mencari kelas karakter[j]
diikuti olehboss
.Ini adalah cara yang bagus untuk menghindari
| grep xyz | grep -v grep
paradigma yang digunakan beberapa orang.sumber
grep
trick tampaknya tidak bekerja di file crontab. Alasan apapun?awk
versi mungkin adalah cara terbaik untuk pergi, tetapi Anda juga dapat menggunakancut
jika Anda terlebih dahulu menekan pengulangan dengantr
:sumber
tr -s ' '
bagus sekali! Saya harap saya bisa mengingatnya lebih baik daripadaawk
Saya suka menggunakan perintah tr -s untuk ini
Ini meremas semua ruang putih hingga 1 ruang. Dengan cara ini, cut cut untuk menggunakan spasi sebagai pembatas dihormati seperti yang diharapkan.
sumber
Saya akan mencalonkan diri
tr -s [:blank:]
sebagai jawaban terbaik.Mengapa kita ingin menggunakan cut? Ini memiliki perintah ajaib yang mengatakan "kami ingin bidang ketiga dan setiap bidang setelahnya, menghilangkan dua bidang pertama"
Saya tidak percaya ada perintah setara untuk awk atau perl split di mana kita tidak tahu berapa banyak bidang yang akan ada, yaitu keluar menempatkan bidang ke-3 melalui bidang X.
sumber
Solusi yang lebih singkat / sederhana: gunakan
cuts
(kurangi steroid yang saya tulis)Perhatikan bahwa
cuts
indeks bidang berbasiskan nol sehingga bidang ke-5 ditetapkan sebagai 4http://arielf.github.io/cuts/
Dan bahkan lebih pendek (tidak menggunakan potongan sama sekali) adalah:
sumber
Salah satu cara untuk mengatasinya adalah dengan:
untuk mengganti beberapa spasi berturut-turut dengan satu.
sumber
\s
adalah ekstensi sed GNU. Pada OS X Anda dapat mengedarkan-E
flag ke sed untuk mengaktifkan ekspresi reguler yang diperluas, kemudian digunakan[[:space:]]
sebagai pengganti\s
, seperti:sed -E 's/[[:space:]]+/ /g'
Secara pribadi, saya cenderung menggunakan awk untuk pekerjaan seperti ini. Sebagai contoh:
sumber
ps axu | awk '/[j]boss/ {print $5}'
.Sebagai alternatif, selalu ada perl:
Atau, jika Anda ingin mendapatkan semua bidang mulai dari bidang # 3 (sebagaimana dinyatakan dalam salah satu jawaban di atas):
sumber
lsof
saya mencobalsof|perl -lane 'print $F[5]'
ini kadang-kadang mendapat kolom ke-5, kadang-kadang ke-6Jika Anda ingin memilih kolom dari output ps, ada alasan untuk tidak menggunakan -o?
misalnya
Lebar kolom minimum dialokasikan, tanpa bantalan, hanya pemisah bidang spasi tunggal.
Pid dan vsz diberi lebar char 10, 1 pemisah bidang spasi.
Digunakan dalam skrip: -
sumber
Cara lain jika Anda harus menggunakan perintah cut
Di Solaris, ganti awk dengan
nawk
atau/usr/xpg4/bin/awk
sumber
Saya masih suka cara Perl menangani bidang dengan ruang putih.
Bidang pertama adalah $ F [0].
sumber
Pendekatan saya adalah menyimpan PID ke file di / tmp, dan untuk menemukan proses yang tepat menggunakan
-S
opsi untukssh
. Itu mungkin penyalahgunaan tetapi bekerja untuk saya.Pendekatan yang lebih baik mungkin untuk meminta
SSH_PID
hak sebelum membunuhnya, karena file mungkin basi dan akan membunuh proses yang salah.sumber