2014-02-25 109 views
0

我有一個用戶數組,我需要查看文件的所有者(logfile.log)是否存在於數組中。使用awk我能夠拉動所有者($ 3),但是當我使用try來查看$ 3是否在用戶中時,我在if語句的開始處得到語法錯誤。我有限的理解是,awk不喜歡語法。在awk中執行IF語句

user=('michael' 'mark' 'luke' 'john' 'phil' 'sam' 'kevin'); 
ls -ldL logfile.log 2>/dev/null | 
/bin/awk '{ 
    Result = $NF ":\tPermissions=" $1; 
    if ([[ "${user[*]}" =~ (^|[^[:alpha:]])$3([^[:alpha:]]|$) ]]) { 
     Result = Result "\tOwner=SUPPORT"; 
    } 
    else { 
     Result = Result "\tOwner=" $3; 
    } 
    print Result; 
}' 
+1

您能否提供樣本輸入和輸出?目前還不清楚你的awk代碼試圖做什麼。此外,使用'stat'獲取日誌文件的所有者可能比試圖分析'ls'的輸出更容易。 – chepner

+0

使用bash/ksh病例語句。 'case $ fileOwner in michael | mark | luke | john | phil | sam | kevin)Owner = Support ;; *)所有者=「其他」;; esac'祝你好運。 – shellter

+0

本質上,我想說如果所有者在數組中,那麼將awk $ 3更改爲SUPPORT。如果其他東西沒有對變量做任何事情。 – user3277026

回答

1

不要解析lshttp://mywiki.wooledge.org/ParsingLs)。使用stat得到所有者(檢查統計手冊頁,也有不同的操作系統的不同實現)

# give your arrays a plural variable name 
users=('michael' 'mark' 'luke' 'john' 'phil' 'sam' 'kevin') 
owner=$(stat -c '%U' logfile.log) 

if [[ " ${users[*]} " == *" $owner "* ]]; then # spaces are deliberate 
    echo logfile.log has a valid owner: $owner 
else 
    echo logfile.log is not owned by a valid user: $owner 
fi 

的另一種方法是迭代這個數組,尋找精確匹配:

valid=false 
for user in "${users[@]}"; do 
    if [[ $user == $owner ]]; then 
     valid=true 
     break 
    fi 
done 
if $valid; then 
    echo file has a valid owner 
fi 

你的代碼中的主要問題是你期望awk理解bash語法。它沒有。

+0

我使用awk,因爲我不僅獲得權限,還獲取所有者,組和文件名。我使用全部4個變量。使用stat -c將會給我所有者 – user3277026

+0

'read perms所有者組mtime <<(stat -Lc「%A%U%G%y」logfile.log) –