Scripting Ksh和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中的变

我已经习惯了vi而不是vim。对于我的工作,我目前正在尝试使用ksh和vi制作一个脚本。我想做的是能够打开并搜索文件中的关键术语和提取信息。例如,我想运行一个ksh脚本,在文件中搜索关键字“subject”,然后提取信息“line one”。我之所以要使用vi,是因为我想将提取的值写入一个文件中,并用逗号分隔一行

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
。。。。此外,为了提高您获得合理答案的机会,您可能还希望包括一个示例,说明到目前为止的预期输出和描述。