đầu ra ps -cl1
của bạn trông như thế này:
UID PID PPID F CPU PRI NI SZ RSS WCHAN S ADDR TTY TIME CMD
501 185 172 104 0 31 0 2453272 1728 - S ffffff80145c5ec0 ?? 0:00.00 httpd
501 303 1 80004004 0 31 0 2456440 1656 - Ss ffffff8015131300 ?? 0:11.78 launchd
501 307 303 4004 0 33 0 2453456 7640 - S ffffff8015130a80 ?? 0:46.17 distnoted
501 323 303 40004004 0 33 0 2480640 9156 - S ffffff80145c4dc0 ?? 0:03.29 UserEventAgent
như vậy, mục cuối cùng trong mỗi dòng là lệnh của bạn. Điều đó có nghĩa là bạn có thể sử dụng toàn bộ sức mạnh của các cụm từ thông dụng để giúp bạn.
Các $
trong một biểu thức chính quy có nghĩa là sự kết thúc của chuỗi, do đó, bạn có thể sử dụng $
để xác định rằng không chỉ đầu ra phải có Skype
trong nó, nó phải kết thúc với Skype
. Điều này có nghĩa nếu bạn có một lệnh gọi Skype Controller
, bạn sẽ không kéo nó lên:
ps -clx | grep 'Skype$' | awk '{print $2}' | head -1
Bạn cũng có thể đơn giản hóa mọi thứ bằng cách sử dụng định dạng ps -o
để chỉ cần kéo lên cột mà bạn muốn:
ps -eo pid,comm | grep 'Skype$' | awk '{print $1}' | head -1
Và, bạn có thể loại bỏ head
chỉ đơn giản bằng cách sử dụng khả năng chọn dòng của bạn cho bạn. Trong số awk
, NR
là số hồ sơ của bạn. Vì vậy bạn có thể làm điều này:
ps -eo pid,comm | grep 'Skype$' | awk 'NR == 1 {print $1}'
Heck, bây giờ mà tôi nghĩ về nó, chúng ta có thể loại bỏ các grep
quá:
ps -eo pid,comm | awk '/Skype$/ {print $1; exit}'
này đang sử dụng khả năng awk để sử dụng biểu thức thông thường. Nếu dòng chứa cụm từ thông dụng, 'Skype $', dòng này sẽ in cột đầu tiên, sau đó thoát ra
Vấn đề duy nhất là nếu bạn có lệnh Foo Skype
, điều này cũng sẽ nhận. Để loại bỏ điều đó, bạn sẽ phải thực hiện một số bước chân ưa thích hơn:
ps -eo pid,comm | while read pid command
do
if [[ "$command" = "Skype" ]]
then
echo $pid
break
fi
done
while read
đang đọc hai biến. Bí quyết là read
sử dụng khoảng trắng để chia các biến mà nó đọc. Tuy nhiên, vì chỉ có hai biến, biến cuối cùng sẽ chứa phần còn lại của toàn bộ dòng. Vì vậy, nếu lệnh là Skype Controller, toàn bộ lệnh sẽ được đưa vào $command
mặc dù có một khoảng trống trong đó.
Bây giờ, chúng tôi không phải sử dụng cụm từ thông dụng. Chúng ta có thể so sánh lệnh với sự bình đẳng.
Quá trình này dài hơn, nhưng bạn thực sự đang sử dụng ít lệnh hơn và ít đường ống hơn. Hãy nhớ awk
đang lặp qua từng dòng. Tất cả những gì bạn đang làm ở đây là làm cho nó rõ ràng hơn. Cuối cùng, điều này thực sự hiệu quả hơn nhiều so với những gì ban đầu bạn có.