在shell中的文件中搜索字符串的一部分

时间:2014-01-06 09:01:23

标签: shell ksh

我有一个包含名单列表的文件。我正在尝试搜索具有特定字符串组的名称,并将它们打印到shell中的新文件中。你能帮忙吗?

这就是我所看到的。 文本文件(names.txt)包含

之类的名称
New York_USA
Delhi
Moscow
Tokyo
Austin_USA
Beijing
Chicago_USA

我试图在单独的文件中使用_USA获取名称。 这是我试过的

#/bin/ksh
for city in "cat names.txt"
do
if ["$city" =~ "*_USA"]
then
echo "$city in USA" > USAnames.txt
fi
done 

3 个答案:

答案 0 :(得分:0)

您只需要执行cat命令而不是引用它,修复您的测试运算符([ - > [[),并附加>>而不是覆盖>,并写一个正则表达式而不是一个glob模式:

#/bin/ksh
for city in `cat names.txt`  # notice the back quotes
do
if [[ "$city" =~ .*_USA ]]
then
echo "$city in USA" >> USAnames.txt
fi
done 

更惯用的方式可能是:

#/bin/ksh
while read city 
do
if [[ "$city" =~ .*_USA ]]
then
echo "$city in USA" >> USAnames.txt
fi
done < names.txt

答案 1 :(得分:0)

使用awksed会更容易

如果你想让输出像这样

New York_USA in USA
Austin_USA in USA
Chicago_USA in USA

使用

awk '/_USA$/ {print $0, "in USA"}' names.txt > USAnames.txt

sed

sed -n 's/\(.*\)_USA$/\0 in USA/p' names.txt > USAnames.txt

或者如果您想要输出

New York in USA
Austin in USA
Chicago in USA

使用

awk -F_ '/_USA$/ {print $1,"in USA"}' names.txt > USAnames.txt

sed

sed -n 's/\(.*\)_USA$/\1 in USA/p' names.txt > USAnames.txt

修改
您也可以使用perl打印出美国城市

#!/usr/bin/env perl
open(NAMES,  "names.txt");
    while (<NAMES>) {
    chomp;
    print "$_ in USA\n" if /_USA$/; # Chicago_USA in USA
    # print "$1 in USA\n" if /(.*)_USA$/; # Chicago in USA
}
close(NAMES);

答案 2 :(得分:0)

只需使用grep:

grep '_USA$' your_file> new_file