这只是我经常遇到的一个例子:
我想将所有.bash_histories复制到一个目录。

grep“ / bin / bash” / etc / passwd | awk -F:'{打印“ cp” $ 6“ /。bash_history / backup” $ 6“ .bash_history”}

输出:

cp /home/peter/.bash_history /backup/home/peter/.bash_history
cp /home/john/.bash_history /backup/home/john/.bash_history

我想要的是这样的输出:

cp /home/peter/.bash_history /backup/_home_peter_.bash_history
cp /home/john/.bash_history /backup/_home_john_.bash_history

并且该输出将被执行。

(这不是专门针对此问题,而是一般而言,如何使用awk和sed重新格式化并执行新创建的命令行,而无需为此真正创建脚本)

最佳答案

获取类似输出的awk脚本将是

grep "/bin/bash" /etc/passwd |head -2 | awk -F: '{ print "cp " $6 "/.bash_history backup/_home_"$1".bash_history" }'


给像这样的输出

cp /root/.bash_history backup/_home_root.bash_history
cp /home/xxx/.bash_history backup/_home_xxx.bash_history


现在,为了执行命令,system()中的awk功能将很有帮助。

system(command)将执行任何命令,并且返回值是该命令的退出状态。

上面的脚本可以修改为

grep "/bin/bash" /etc/passwd |head -2 | awk -F: '{ system("cp " $6 "/.bash_history backup/_home_"$1".bash_history;") }'


测试运行:

$ grep "/bin/bash" /etc/passwd |head -2 | awk -F: '{ system("cp " $6 "/.bash_history backup/_home_"$1".bash_history;") }'
$ ls backup/
_home_xxx.bash_history  _home_root.bash_history


PS:不建议在根文件夹中创建目录。因此,我有意将脚本中的/backup替换为backup

为了使脚本成功执行,必须先创建backup文件夹。

关于linux - 使用awk重新格式化并从STDIN进行sed并执行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26689815/

10-10 17:44
查看更多