在UNIX中从文本文件中提取特定文本

时间:2011-10-10 15:53:39

标签: shell unix scripting

我在使用UNIX shell脚本时遇到了一些问题,特别是文件读取问题。我希望最终产品是脚本将文本文件作为命令行参数,然后提取某些部分以在各种操作中使用。文本文件如下所示:

ABC12345:John Smith:78
DEF12345:Jane Doe:80
GHI12345:Bob Johnson:91

它会像其他几行一样继续下去。到目前为止,我已经完成了在最后一个冒号之后提取数字的代码片段:

case $1 in

   m)cat $2 | while read -r file; do
   #gets the numbers from 0 to 100
   current=grep [0-100]

case语句只是因为最终用户将能够以不同的方式运行程序。然而,代码段中的主要思想是在文本文件的行尾使用2位数字,并将其存储在当前变量中。

其余的操作实际上围绕着这个想法,但是,我并不完全确定如何在中间提取名称。

无论如何,任何帮助都会很棒!请记住,我对此很新。

4 个答案:

答案 0 :(得分:1)

正如frankc所说,awk或cut会运作良好。你也可以摆弄IFS和(假设Bash)数组:

_old_ifs="$IFS"
IFS=":"
ID_NAME_GRADE=( $LINE )
IFS="$_old_ifs"

echo "Hello ${ID_NAME_GRADE[1]}, your grade is ${ID_NAME_GRADE[2]}"

答案 1 :(得分:1)

试试这个:

$ while IFS=: read a b c; do echo $c; done < input.txt

这将回显每一行的第三个字段。修改以满足您的需求。

答案 2 :(得分:0)

在您的案例中有很多方法可以提取姓名和得分。见例子:

kent$  cat t
ABC12345:John Smith:78
DEF12345:Jane Doe:80
GHI12345:Bob Johnson:91

#using awk 
kent$  awk -F: '{print "name="$2,", score="$3}' t                                         
name=John Smith , score=78
name=Jane Doe , score=80
name=Bob Johnson , score=91

#using cat
kent$  sed -r 's/[^:]*?:([^:]*):([0-9]*)$/name=\1, score=\2/g' t
name=John Smith, score=78
name=Jane Doe, score=80
name=Bob Johnson, score=91

#or just catch it directly with grep
kent$  grep -Po  "(?<=:)[^:]*(?=:)|(?<=:)\d+$" t
John Smith
78
Jane Doe
80
Bob Johnson
91

cut也可以。

答案 3 :(得分:0)

AWk -F:'{print $ NF}'file_name