2012-04-23 128 views
6

我真的是新的bash,但它是學校的主題之一。其中一個練習是:Bash:從命令輸出的grep模式

給出關於您自己的登錄信息的文件「/ etc/passwd」的行號。

假設USERNAME是我自己的登錄ID,我能完全做到這樣:

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

它只是給了需要的行號(也有可能是一個更優化的方式)。不過,我想知道是否有辦法讓命令更通用,以便它使用whoami的輸出來表示grep模式,而不使用腳本或使用變量來代表。換句話說,以保持一個易於閱讀的一個行命令,像這樣:

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

很抱歉,如果這是一個非常noob問題。

回答

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

圍繞'標記的命令使得執行命令,並輸出送入它裹在,在bash手冊頁

+0

好的,反引號......當然:)謝謝! – MarioDS 2012-04-23 12:55:18

+1

沒有錨定,如果您的登錄名稱與該行其他地方匹配,則可能會產生錯誤匹配。我以前在本地系統上有一個簡短的登錄名,它恰好匹配(「系統操作員」的子字符串),所以當我不是時,一些愚蠢的軟件認爲我是「root」。 – tripleee 2014-11-17 11:58:41

9

檢查命令替換命令。

你可以回剔``$(),我個人更喜歡後者。

因此,對於你的問題:

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

將取代的whoami的輸出參數爲-e標誌grep命令和整個命令的輸出將是行號在運行用戶的/etc/passwd

+0

+1因爲它有效,但Lynn的回答更清晰(至少對像我這樣的初學者:))但我喜歡你指出我應該使用grep的-n開關來縮短它。 – MarioDS 2012-04-23 13:01:48

+4

+1,我更喜歡'$()'構造,只是因爲它更容易嵌套。 – paxdiablo 2012-04-23 13:11:41

+0

+1爲了指出兩種語法:) – 2012-04-23 13:19:14

10

您可以用單一awk調用做到這一點:

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

的詳細信息:

  • -v創建一個awk變量稱爲me,並與您的用戶名填充它。
  • -F將字段分隔符設置爲:以配合密碼文件。
  • $1==me僅選擇第一個字段與您的用戶名匹配的行。
  • print輸出記錄號(行)。
+0

感謝您的很好的解釋,但現在它似乎先進我建立這樣的命令我自己:) – MarioDS 2012-04-23 13:12:21

+3

@Mario:你越早開始學習,越早你會能夠爲您的開發服務收取昂貴的費用:-) – paxdiablo 2012-04-23 13:13:30

+0

+1爲了向noobie炫耀awk – 2012-04-23 13:19:38