Bash 用于匹配安装路径的正则表达式

Bash 用于匹配安装路径的正则表达式,bash,awk,Bash,Awk,我需要从文件中提取主机上TWS的有效安装路径: /usr/Tivoli/TWS/TWS/ /usr/Tivoli_123/TWS_123/TWS/ /usr/Tivoli_123/TWS/TWS_123/ /usr/Tivoli_123/XYZ/TWS 任何像/usr/Tivoli.*/TWS/TWS.*这样的格式都是有效的。我在以下命令中使用此正则表达式: cat ../TWS/test | awk -F " " '/Tivoli.*\/TWS\/TWS.*/{print

我需要从文件中提取主机上TWS的有效安装路径:

/usr/Tivoli/TWS/TWS/
/usr/Tivoli_123/TWS_123/TWS/
/usr/Tivoli_123/TWS/TWS_123/
/usr/Tivoli_123/XYZ/TWS
任何像
/usr/Tivoli.*/TWS/TWS.*
这样的格式都是有效的。我在以下命令中使用此正则表达式:

cat ../TWS/test | awk -F " " '/Tivoli.*\/TWS\/TWS.*/{print $1}'
但它给出了包含所有条目的输出:

/usr/Tivoli/TWS/TWS/
/usr/Tivoli_123/TWS_123/TWS/
/usr/Tivoli_123/TWS/TWS_123/
/usr/Tivoli_123/XYZ/TWS
正则表达式有什么问题

任何像/usr/Tivoli\u/TWS/TWS\u这样的格式都是有效的

只是

应该足够只打印这些匹配的行

但您也可以在shell中用
case
进行字面匹配:

while IFS= read -r line; do
    case "$line" in
    /usr/Tivoli_*/TWS/TWS_*) echo "$line"; ;;
    esac
done < ../TWS/test 
而IFS=read-r行;做
大写“$line”
/usr/Tivoli_*/TWS/TWS_*)回声“$line”;;
以撒
完成<../TWS/测试

*
匹配任何文本,包括
/
。将
替换为
[^\/]
(OT:)
Tivoli.*
不是
Tivoli.*
,而是
Tivoli.*
。相同的
TWS.
不是
TWS.*
而是
TWS.*
@HyperioN:
TWS.*
匹配任何在某处包含TWS的行。
*
部分是冗余的;你也可以省略它。
while IFS= read -r line; do
    case "$line" in
    /usr/Tivoli_*/TWS/TWS_*) echo "$line"; ;;
    esac
done < ../TWS/test