一千萬個為什麽

搜索

如何使用某些字符串過濾的awk從文件中刪除一行

我有一個由空格分隔的文件。 我需要編寫一個接收主機名參數的awk命令 它應該替換主機名,如果它已在文件中定義。 它必須是完全匹配而不是部分匹配 - 如果文件包含此主機名:localhost 搜索“ho”將失敗,它將被添加到文件的末尾。

另一個選項是刪除:再次awk接收主機名參數,它應該從文件中刪除它(如果存在)。

這是我到目前為止:(需要一些增強功能)

if [ "$DELETE_FLAG" == "" ]; then
        # In this case the entry should be added or updated
        #    if clause deals with updating an existing entry
        #    END clause deals with adding a new entry
        awk -F"[ ]" "BEGIN { found = 0;} \
                { \
                        if ($2 == $HOST_NAME) { \
                                print \"$IP_ADDRESS $HOST_NAME\"; \
                                found = 1; \
                        } else { \
                                print \$0; \
                        } \
                } \
                END { \
                        if (found == 0) { \
                                print \"$IP_ADDRESS $HOST_NAME\";
                        } \
                } " \
        /etc/hosts > /etc/temp_hosts

else
        # Delete an existing entry
        awk -F'[ ]' '{if($2 != $HOST_NAME) { print $0} }' /etc/hosts > /etc/temp_hosts
fi

謝謝

最佳答案

您不必將 FS 設置為空格,因為默認情況下 FS 已經是空格。而且您不必使用 \ 。使用 -v 選項將shell變量傳遞給awk。並且在每個陳述的末尾都不需要使用分號

if [ "$DELETE_FLAG" == "" ]; then
        # In this case the entry should be added or updated
        #    if clause deals with updating an existing entry
        #    END clause deals with adding a new entry
        awk  -v hostname="$HOST_NAME" -v ip="$IP_ADDRESS" 'BEGIN { found = 0} 
        { 
            if ($2 == hostname) { 
                 print ip"  "hostname
                 found = 1
            } else { 
                 print $0 
            } 
        } 
        END { 
             if (found == 0) { 
                  print ip" "hostname
             } 
        }' /etc/hosts > /etc/temp_hosts

else
        # Delete an existing entry
        awk -v hostname="$HOST_NAME" '$2!=hostname' /etc/hosts > /etc/temp_hosts
fi

轉載註明原文: 如何使用某些字符串過濾的awk從文件中刪除一行