2011-03-04 23 views
1

這是開始bash類中作業問題的一部分。 我需要引入passwd文件,這是我用passfile變量完成的,然後我需要能夠提取它的某些部分並顯示不同的字段。當我使用下面的語句手動grep CLI時,它工作正常。我想要所有的變量,我把它們全部拿出來。在If語句中使用grep來獲取所有項目,忽略空格

grep 1000 passfile | cut -c1- 

但是,當我從腳本執行此操作時,它停止或中斷或在用戶全名的第一個「空格」處重新開始。當我只想要一個時,John D. Doe會返回3行。我通過迴應我和以下的價值來看到這一點。

for i in `grep 1000 ${passfile} | cut -c1- 

user=`echo $1 | cut -d : -f1` 
userID=`echo $1 | cut -d : -f3` 

例如,如果行讀取

jdoe:x:123:1000:John D Doe:/home/jdoe:/bin/bash 

我得到如下:

i = jdoe:x:123:1000:John 

這給了我: 用戶是JDOE,UID是509

但然後在下一行我從R開始。
我= R.所以用戶是R.,UID是R.

下一行

i = Johnson:/home/jjohnson:/bin/bash 

返回用戶是約翰遜,UID是/斌/慶典

的passwd文件保存許多用戶,所以我需要使用for循環來處理它們。我認爲如果我能讓它忽略我能得到的空間。但是不知道有關Linux的很多內容,我不確定我是否會走上正確的道路。在此先感謝您的指導/幫助。

回答

1

默認情況下,cut在空格而不是冒號上拆分。如果您繼續使用它,請指定分隔符。

你可能想使用IFS=:read聲明中while循環得到的值:

while IFS=: read user password uid gid comment home shell 
do 
    ...whatever... 
done < /etc/passwd 

或者你可以管的grep輸出到while循環。

+0

'cut'接受'-d'分隔符選項 – knittl 2011-03-07 11:27:04

+0

@ knittl:是的,它的確如此 - 它在輸入和輸出上使用相同的分隔符。有時,如果它處理輸入上的i分隔符並在輸出上生成o分隔符,將會很方便。 AFAIK,它沒有。你也面臨着空間領域的問題。 – 2011-03-07 13:24:53

0

您允許使用任何外部程序嗎?如果是的話,我建議你awk

UID=1000 
awkcmd="\$4==\"$UID\" {print \"user:\",\$1}" 
cat $PASSWORDFILE | awk -F ":" "$awkcmd" 
+0

爲什麼需要創建一個像awkcmd這樣的變量?而且貓不需要。這裏是awk的一行:'awk -vuid = $ UID'$ 4 == uid {print「user:」$ 1}'file' – kurumi 2011-03-07 10:40:50

+0

只是爲了讓它更易於理解。我認爲。當OP對awk更熟悉時,他可以做一些很酷的單行內容:-) – pepoluan 2011-03-08 10:27:33

0
解析與特定的字段分隔符,如passwd文件結構的文件時

,這項工作的合適的工具是AWK。

UID=1000 
awk -vuid="$UID" '$4==uid{print "user: "$1}' /etc/passwd 

你不必使用grep或cut或其他任何東西。 (當然,你也可以在讀取循環時使用純bash)