逐行读取并替换字符串

时间:2014-10-02 07:40:02

标签: bash unix awk sed

我目前遇到一个问题,我需要逐行读取文件。

在我逐行阅读之后,有一些命令我需要更改一个特定的字符串。(在我的情况下,我必须创建一个脚本,将所有密码更改为哈希值)

以下是输入示例

hostName=TEST123
hostIpAddr=TEST123
hostUserName=test112
hostPassword=test146

HostName=11.111.111
HostIpAddr=12.12.121
UserName=UseR1
Password=UsEr1

我只是尝试使用此代码更改密码的第二次出现。

passNew=grep 'Password' test.file | awk -F= '{print $2}' | openssl enc -aes-128-cbc -a -salt -pass pass:wtf
passStr=grep 'Password' test_dev.param | awk -F= '{print $2}'
sed 13,/$passStr/{s@$passStr@$passNew@} test.file > test1.file

我无法获得任何帮助,所以我可以循环播放?并将每次出现的密码转换为哈希?

示例输出必须是:

hostName=TEST123
hostIpAddr=TEST123
hostUserName=test112
hostPassword=JfsjeoOf3001=

HostName=11.111.111
HostIpAddr=12.12.121
UserName=UseR1
Password=Fkjdslkjqksnlkc491/+FDSJLK=

2 个答案:

答案 0 :(得分:1)

单行awk

awk -F'=' -v q="'" '/Password/{ cmd="echo " q $2 q" | openssl enc -aes-128-cbc -a -salt -pass pass:wtf"; cmd | getline $2 }1' OFS="=" yourfile

更具可读性awk版本:

#!/bin/awk -f                           

BEGIN {
        FS=OFS="=";
        q="'";
}

/Password/ {
        cmd="echo " q $2 q " | openssl enc -aes-128-cbc -a -salt -pass pass:wtf";
        cmd | getline $2
}1

执行命令

$ awk -f script.awk inputfile > outputfile

<强>解释

  • FS=OFS="=" - 将输入/输出字段分隔符设置为=
  • /Password/ { ... } - 仅对包含模式Password的行执行密码哈希转换。
  • 接下来,发出命令。
  • cmd | getline $2 - 执行命令并将输出存储在$2
  • 1 - 真实价值。在这种情况下,awk的默认行为是打印当前行({print $0})。

答案 1 :(得分:0)

对于小文件,我不建议使用任何非内置实用程序。 Openssl是唯一需要的。以下是示例代码:

#!/usr/bin/bash

cat << INPUT >inputfile
hostName=TEST123
hostIpAddr=TEST123
hostUserName=test112
hostPassword=test146

HostName=11.111.111
HostIpAddr=12.12.121
UserName=UseR1
Password=UsEr1
INPUT

while read -r f; do
    if [[ $f =~ ([^=]*Password=)(.*) ]]; then
        #echo ${BASH_REMATCH[1]}, ${BASH_REMATCH[2]}
        new=$(openssl enc -aes-128-cbc -a -salt -pass pass:wtf <<< ${BASH_REMATCH[2]})
        f="${BASH_REMATCH[1]}$new"
    fi
    echo "$f"
done < inputfile

输出是:

hostName=TEST123
hostIpAddr=TEST123
hostUserName=test112
hostPassword=U2FsdGVkX18HCG/khxco1skg2v9UTcXjqPPda0g3tuI=

HostName=11.111.111
HostIpAddr=12.12.121
UserName=UseR1
Password=U2FsdGVkX1/8c3O8m6vTnU75bs4EBCGLKmfL1PWxk4M=

我希望这有点帮助。

while循环中,它会读取所有行并尝试使用[[...]]中显示的模式进行数学运算。如果找到匹配,则转换密码部分并放入env.var。并使用新密码打印找到的密码标记。

-r选项禁用\的转义含义,因此可以在密码字符串中使用。

如果密码包含字符串'Password =',则会出现问题,但这种情况很少见。如果发生这种情况,可以使用另一个if来检查案例。据我所知,[[...]]使用的RE没有像那样的非贪婪正则表达式选项。 已解决

相关问题