2017-06-06 76 views
0

我有一個腳本在文件中執行多個驗證。 驗證之一是檢查一行是否超過95個字符(包括空格)。如果是,則會返回行數超過95個字符的行號。下面是用於驗證的命令:awk命令返回不一致的結果

$(cat $FileName > $tempfile) 
totalCharacters=$(awk '{print length($0);}' $tempFile | grep -vn [9][4]) 
if [[$totalCharacters != "" ]]; then 
    totalCharacters=$(awk '{print length($0);}' $tempFile | grep -vn [9][4] | cut -d : -f1 | tr "\n" ",") 
    echo "line too long" 
    exit 1 
fi 

在較低的環境中的代碼按預期工作。但在生產中,有時候驗證會返回錯誤「行太長」,但不返回任何行號。我們只是重新編寫腳本,它不會返回任何錯誤。

我想知道在使用的命令中可能出錯。 以前的開發人員說這可能是使用awk命令的問題,但我不確定,因爲這是我第一次遇到使用awk命令。

+0

你覺得呢'$(貓$文件名> $臨時文件)'是要幹什麼?我認爲它會將'$ FileName'命名的文件與'tempfile'連接起來,並將輸出放在文件'$'中。然後捕獲標準輸出 - 幸運的是標準輸出爲空 - 並將該輸出解析爲命令並運行。你不需要'$(...)',你可能想使用'cat「$ FileName」>「$ tempfile」' - 雖然不清楚爲什麼你需要一個輸入的副本來處理;你顯然可以使用原始文件。 –

+0

請注意'grep -vn [9] [4]'命令是奇數;它與'grep -vn 94'相同並搜索不包含'94'的行(輸出行號和匹配文本)。請注意,這意味着長度爲'194','294','940','1945'等的行將不會被選中(以及長度爲「94」的行)。 –

+0

對不起,我沒有注意到tempFile之前的空間,當我在這裏編寫代碼時,你是正確的,它應該是$ tempFile。輸入的副本可能只是用於備份,當我得到多次修改的腳本時就是這樣。對於grep-vn [9] [4],我不知道它不會選擇這些行,我向他解釋的是,grep會檢查文件是否有多於94個字符的行。 – Patrick

回答

2

這是寫得不好。所有你需要的是:

awk 'length>94{print NR; f=1} END{exit f}' file 

如果有超過94個字符的行,它會打印行號和退出狀態1;否則退出狀態將爲0並且不會生成輸出。

+0

我想如果有人想要看中並輸出長度,他們可以使用'{printf'l:%-6d c:%3d \ n「,NR,length; F = 1} ...' –

0

您的腳本應該僅僅是:

awk ' 
    length()>95 { printf "%s%d", (c++?",":""), NR } 
    END { if (c) {print "line too long"; exit 1} } 
' "$FileName" 
相關問題