这只是我经常遇到的一个例子:
我想将所有.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/