2012-04-23 40 views
6

Tôi thực sự mới với bash, nhưng đó là một trong những môn học ở trường. Một trong các bài tập là:Bash: mẫu grep từ đầu ra lệnh

Cho số dòng của tệp "/ etc/passwd" nơi thông tin về thông tin đăng nhập của bạn.

Giả sử USERNAME là ID đăng nhập của riêng tôi, tôi đã có thể làm điều đó một cách hoàn hảo theo cách này:

cat /etc/passwd -n | grep USERNAME | cut -f1 

Mà chỉ đơn giản là đưa số dòng cần thiết (có thể là một cách tối ưu hơn). Tuy nhiên, tôi tự hỏi, nếu có một cách để làm cho lệnh tổng quát hơn để nó sử dụng đầu ra của whoami để đại diện cho mẫu grep, mà không có kịch bản hoặc sử dụng biến. Nói cách khác, để giữ cho nó trở thành một dòng lệnh dễ đọc, như vậy:

cat /etc/passwd -n | grep (whoami) | cut -f1 

Xin lỗi nếu đây là câu hỏi thực sự.

Trả lời

16
cat /etc/passwd -n | grep `whoami` | cut -f1 

Xung quanh một lệnh trong `dấu làm cho nó thực hiện lệnh và gửi đầu ra vào lệnh nó được bọc trong.

+0

OK, backticks ... Tất nhiên :) Cảm ơn! – MarioDS

+1

Nếu không có neo, điều này có thể tạo ra các kết quả trùng khớp nếu tên đăng nhập của bạn khớp với nơi khác trên đường truyền. Tôi đã từng có một tên đăng nhập ngắn trên một hệ thống địa phương đã xảy ra để phù hợp (một chuỗi con) của "Nhà điều hành hệ thống" vì vậy một số phần mềm ngu ngốc nghĩ rằng tôi là 'root' khi tôi không. – tripleee

9

Kiểm tra lệnh thay trong trang bash người đàn ông.

Bạn có thể quay lại các dấu tích `` hoặc $() và cá nhân tôi thích thứ hai.

Vì vậy, câu hỏi của bạn:

grep -n -e $(whoami) /etc/passwd | cut -f1 -d : 

sẽ thay thế đầu ra của whoami như là đối số cho -e cờ của lệnh grep và đầu ra của toàn bộ lệnh sẽ là số dòng trong /etc/passwd của người sử dụng chạy .

+0

+1 bởi vì nó hoạt động, nhưng câu trả lời của Lynn là rõ ràng hơn để đọc (ít nhất là một người mới bắt đầu như tôi :)) nhưng tôi thích rằng bạn chỉ ra tôi nên sử dụng chuyển đổi -n của grep để làm cho nó ngắn hơn. – MarioDS

+4

+1, tôi cũng thích cấu trúc '$()', đơn giản vì nó dễ dàng hơn để làm tổ. – paxdiablo

+0

+1 Để chỉ ra cả hai cú pháp :) –

10

Bạn có thể làm điều này với một awk gọi duy nhất:

awk -v me=$(whoami) -F: '$1==me{print NR}' /etc/passwd 

Cụ thể hơn:

  • các -v tạo ra một biến awk gọi me và populates nó với tên người dùng của bạn.
  • -F đặt trình tách trường thành : làm trang phục tệp mật khẩu.
  • các $1==me chỉ chọn các dòng nơi trường đầu tiên khớp với tên người dùng của bạn.
  • số print xuất ra số bản ghi (dòng).
+0

cảm ơn vì lời giải thích tuyệt vời, nhưng hiện tại có vẻ như tôi đã nâng cao các lệnh như vậy :) – MarioDS

+3

@Mario: bạn càng sớm bắt đầu học, càng sớm càng tốt có thể tính mức giá cắt cổ cho các dịch vụ phát triển của bạn :-) – paxdiablo

+0

+1 Để hiển thị ra khỏi awk để một noobie –

Các vấn đề liên quan