2017-03-09 105 views
0

試圖製作一個具有每個目錄和文件的UID/GID的文件。bash(用另一個文件中的值替換列中的值)

out」包括所有具有用戶名和組名的目錄/文件。

而且我想這個比較的/ etc/passwd文件$1柱,並用UID更換/在/etc/passwd

所以GID上市讓我們說 「out」 包括」

sam samgroup /home/sam/hi 
aaron samgroup /home/aaron/no 

我想它變成

1001 1002 /home/sam/hi 
1002 1002 /home/aaron/no 

(在與列對比並替換/從/etc/passwd附加後)

我寫了這個,但是這在邏輯上是正確的?如果不是,如何解決它? 謝謝。

[增訂]

one="$(awk -F ":" '{print $2}' out)" 
psw="$(awk -F ":" '{print $1}' /etc/passwd)" 
pswthree="$(awk -F ":" '{print $3}' /etc/passwd)" 
pswfour="$(awk -F ":" '{print $4}' /etc/passwd)" 


while read -r out 
do 
     if [ $one == $two ] 
       then sed "s/$one/$pswthree/g" <<< "$out" 
     fi 
done < out 

樣品/ etc/passwd中

nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin 
qemu:x:107:107:qemu user:/:/sbin/nologin 
+0

幾個錯誤:你讀入變量但沒有使用該值 - 你應該在'while'中使用'$ out'。你並不是真的在運行'awk',你想要'$(awk ...)'這樣的東西。但是你首先需要在/ etc/passwd中搜索匹配的行,我沒有看到你這樣做。在if後,你需要'然後'和'fi',而不是'do'。 –

+0

有一些語法錯誤。這應該是在讀取-r行時,你應該完成 2017-03-09 16:40:06

+0

我會首先確保您可以迭代文件中的行並將其打印出來。 'while read -r line do echo $ line done 2017-03-09 16:42:01

回答

0

awk來救援!

我想這是你想要做

$ awk -F: 'NR==FNR {a[$1]=$3 OFS $4; next} # cache /etc/passwd user/groupids 
      $1 in a {print a[$1], $3; next} # if found replace 
      1' /etc/passwd FS=' +' out   # otherwise print as is 

必要沒有明確的循環是什麼

注:ID字段應該是在密碼文件3和4。

+0

輸出什麼也沒有,所以我正在尋找修改我的問題 – SndLt

+0

你是用組名或用戶名搜索?你的文件似乎是「用戶組目錄」格式,但你使用的是第二個字段。你可以發佈/ etc/passwd文件的示例部分嗎? – karakfa

+0

我已經把樣例「/ etc/passwd」非常感謝您的時間。我試圖同時調試我的「if」語句。 – SndLt

相關問題