Scripting Ksh和Vi脚本
我已经习惯了vi而不是vim。对于我的工作,我目前正在尝试使用ksh和vi制作一个脚本。我想做的是能够打开并搜索文件中的关键术语和提取信息。例如,我想运行一个ksh脚本,在文件中搜索关键字“subject”,然后提取信息“line one”。我之所以要使用vi,是因为我想将提取的值写入一个文件中,并用逗号分隔一行Scripting Ksh和Vi脚本,scripting,edit,vi,ksh,Scripting,Edit,Vi,Ksh,我已经习惯了vi而不是vim。对于我的工作,我目前正在尝试使用ksh和vi制作一个脚本。我想做的是能够打开并搜索文件中的关键术语和提取信息。例如,我想运行一个ksh脚本,在文件中搜索关键字“subject”,然后提取信息“line one”。我之所以要使用vi,是因为我想将提取的值写入一个文件中,并用逗号分隔一行 Subject: line one Content: line two 谢谢你的帮助和推荐 编辑:是的,使用sed、awk和grep是一种更有效的方法。但我在将结果分配给ksh中的变
Subject: line one
Content: line two
谢谢你的帮助和推荐
编辑:是的,使用sed、awk和grep是一种更有效的方法。但我在将结果分配给ksh中的变量时遇到问题,目前我有:
testing=grep Primary /u/mtjandr/temp.txt | sed -e 's/[:a-zA-Z]* //g'
grep Primary /u/mtjandr/temp.txt | sed -e 's/[:a-zA-Z]* //g'
它本身输出正确的结果,但当我尝试将其分配给变量时,会得到erorr
copy_group.sh[18]:主:未找到
更新:我找到了我的解决方案:
testing=`grep Primary /u/mtjandr/temp.txt | sed -e 's/[:a-zA-Z]* //g'`
考虑到您的文件可能看起来很普通,您可能希望查看,正如Shawn提到的
Grep
提供您感兴趣的行,awk
提取字段并sed
编辑整个内容
因此,在您的示例中,您希望找到包含主题的行:
grep Subject file
并提取第一行
:
awk '{printf "%s %s,", $2, $3}'
最后删除文件末尾插入的额外,
sed 's/,$//'
这三个命令需要通过管道连接在一起:
grep Subject file | awk '{printf "%s %s,", $2, $3}' | sed -e 's/,$//'
当然,awk
部分需要根据您的确切文件结构进行定制
最后,要将整个内容写入另一个文件(而不是输出),可以将上述命令的输出重定向到一个文件:
grep Subject file | awk '{printf "%s %s,", $2, $3}' | sed -e 's/,$//' > other_file
正如我在上面的评论中所说,有许多其他更简单的方法可以实现这一目标,使用专门为此目的设计的工具,例如sed
,awk
,grep
如果您确实决定尝试一下vi
以外的东西,那么下面是一个使用单个awk
命令的版本:
awk '/^Subject: /{printf "%s%s",x,substr($0,10);x=","}' in.txt > out.txt
例如:
[me@home]$ cat in.txt
Subject: line one
Content: line two
Subject: line three
yadda yadda
[me@home]$ awk '/^Subject: /{printf "%s%s",x,substr($0,10);x=","}' in.txt > out.txt
[me@home]$ cat out.txt
line one,line three
x=”,“
位是,因此我们可以在第一个输出之外的所有输出前面加逗号。为了更具可读性,我们可以简单地将输出记录分隔符(ORS)从\n
更改为逗号。但是,这将导致后面的逗号,我们需要用另一个命令删除它
在本例中,我们通过管道将输出传输到sed
,以删除尾部分隔符:
awk -v ORS=',' '/^Subject: /{print substr($0,10)}' in.txt | sed -e 's/,$//' > out.txt
命令细目:
awk -v ORS=',' '/^Subject: /{print substr($0,10)}' in.txt | sed -e 's/,$//' > out.txt
_________ __________ ___________________ ______ _______________ _________
| | | | | |
separate output | OUtput the line | Remove trailing |
records with | from char 10 | comma |
comma (not \n) | onwards | |
| | Redirect output
Match lines that input file to out.txt
start with "Subject :"
我仍然不明白为什么必须使用vi.
还有许多其他更简单的方法可以实现这一点,使用专门为此设计的工具,例如sed
,awk
,grep
。。。。此外,为了提高您获得合理答案的机会,您可能还希望包括一个示例,说明到目前为止的预期输出和描述。