select 个子域使用打印命令
select subdomains using print command
猫a.txt
a.b.c.d.e.google.com
x.y.z.google.com
rev a.txt | awk -F. '{print ,}' | rev
这显示:
e google
x google
但我想要这个输出
a.b.c.d.e.google
b.c.d.e.google
c.d.e.google
e.google
x.y.z.google
y.z.google
z.google
提前致谢
使用您显示的示例,请尝试以下 awk
代码。在 GNU awk
中编写和测试应该在任何 awk
.
中工作
awk '
BEGIN{
FS=OFS="."
}
{
nf=NF
for(i=1;i<(nf-1);i++){
print
=""
sub(/^[[:space:]]*\./,"")
}
}
' Input_file
使用sed
$ sed -En 'p;:a;s/[^.]+\.(.*([^.]+\.){2}[[:alpha:]]+$)//p;ta' input_file
a.b.c.d.e.google.com
b.c.d.e.google.com
c.d.e.google.com
d.e.google.com
e.google.com
x.y.z.google.com
y.z.google.com
z.google.com
使用bash:
IFS=.
while read -ra a; do
for ((i=${#a[@]}; i>2; i--)); do
echo "${a[*]: -i}"
done
done < a.txt
给出:
a.b.c.d.e.google.com
b.c.d.e.google.com
c.d.e.google.com
d.e.google.com
e.google.com
x.y.z.google.com
y.z.google.com
z.google.com
(我假设您的预期输出中缺少 d.e.google.com
是拼写错误?)
这是另一种 awk 解决方案:
awk -F. '{while (!/^[^.]+\.[^.]+$/) {print; sub(/^[^.]+\./, "")}}' file
a.b.c.d.e.google.com
b.c.d.e.google.com
c.d.e.google.com
d.e.google.com
e.google.com
x.y.z.google.com
y.z.google.com
z.google.com
对于更短且可以说更简单的解决方案,您可以使用 Perl。
将auto-split点字符上的那一行放入@F
数组中,然后打印你想要的范围:
perl -F'\.' -le 'print join(".", @F[0..$#F-1])' a.txt
-F'\.'
将 auto-split 每个输入行放入 @F
数组。它将根据给定的正则表达式进行拆分,因此需要对点进行转义才能按字面意思进行处理。
$#F
是数组中的元素个数。所以@F[0..$#F-1]
就是从第一个($F[0]
)到倒数第二个元素的范围。如果您想省略“google”和“com”,您可以使用 @F[0..$#F-2]
等
猫a.txt
a.b.c.d.e.google.com
x.y.z.google.com
rev a.txt | awk -F. '{print ,}' | rev
这显示:
e google
x google
但我想要这个输出
a.b.c.d.e.google
b.c.d.e.google
c.d.e.google
e.google
x.y.z.google
y.z.google
z.google
提前致谢
使用您显示的示例,请尝试以下 awk
代码。在 GNU awk
中编写和测试应该在任何 awk
.
awk '
BEGIN{
FS=OFS="."
}
{
nf=NF
for(i=1;i<(nf-1);i++){
print
=""
sub(/^[[:space:]]*\./,"")
}
}
' Input_file
使用sed
$ sed -En 'p;:a;s/[^.]+\.(.*([^.]+\.){2}[[:alpha:]]+$)//p;ta' input_file
a.b.c.d.e.google.com
b.c.d.e.google.com
c.d.e.google.com
d.e.google.com
e.google.com
x.y.z.google.com
y.z.google.com
z.google.com
使用bash:
IFS=.
while read -ra a; do
for ((i=${#a[@]}; i>2; i--)); do
echo "${a[*]: -i}"
done
done < a.txt
给出:
a.b.c.d.e.google.com
b.c.d.e.google.com
c.d.e.google.com
d.e.google.com
e.google.com
x.y.z.google.com
y.z.google.com
z.google.com
(我假设您的预期输出中缺少 d.e.google.com
是拼写错误?)
这是另一种 awk 解决方案:
awk -F. '{while (!/^[^.]+\.[^.]+$/) {print; sub(/^[^.]+\./, "")}}' file
a.b.c.d.e.google.com
b.c.d.e.google.com
c.d.e.google.com
d.e.google.com
e.google.com
x.y.z.google.com
y.z.google.com
z.google.com
对于更短且可以说更简单的解决方案,您可以使用 Perl。
将auto-split点字符上的那一行放入@F
数组中,然后打印你想要的范围:
perl -F'\.' -le 'print join(".", @F[0..$#F-1])' a.txt
-F'\.'
将 auto-split 每个输入行放入 @F
数组。它将根据给定的正则表达式进行拆分,因此需要对点进行转义才能按字面意思进行处理。
$#F
是数组中的元素个数。所以@F[0..$#F-1]
就是从第一个($F[0]
)到倒数第二个元素的范围。如果您想省略“google”和“com”,您可以使用 @F[0..$#F-2]
等