使用时会发生什么$1,$2...在END块,如:
awk '{print $3}END{print $1 $2}'
Run Code Online (Sandbox Code Playgroud)
我发现$1并$2保留了最后一条记录的值.这种行为是由标准保证还是特定于实现?
的行为
!(pattern-list)
Run Code Online (Sandbox Code Playgroud)
特别是在参数扩展中使用时,我的工作方式不正常
${parameter/pattern/string}
Run Code Online (Sandbox Code Playgroud)
a="1 2 3 4 5 6 7 8 9 10"
Run Code Online (Sandbox Code Playgroud)
$ printf "%s\n" "${a/!([0-9])/}"
[blank]
#expected 12 3 4 5 6 7 8 9 10
$ printf "%s\n" "${a/!(2)/}"
[blank]
#expected 2 3 4 5 6 7 8 9 10
$ printf "%s\n" "${a/!(*2*)/}"
2 3 4 5 6 7 8 9 10
#Produces the behaviour expected in previous one, not sure why though
$ printf "%s\n" "${a/!(*2*)/,}"
,2 3 4 5 6 …Run Code Online (Sandbox Code Playgroud) 我想我理解了可选的使用 ?(pattern-list)(bash当extglobshell 选项打开时)和默认情况下的使用ksh。例如在bash:
$ shopt -s extglob
$ V=35xAB
$ echo "${V#?(35|88)x}" "${V#35}"
AB xAB
Run Code Online (Sandbox Code Playgroud)
但是,当匹配的前缀模式只有 one?()或 one时*()(这引入了我所说的可选模式),35除非使用,否则不会被省略##:
$ echo "${V#?(35|88)}" "${V#*(35|88)}" # Why 35 is not left out?
35xA 35xA
$ echo "${V##?(35|88)}" "${V##*(35|88)}" # Why is it omitted when ## is used?
xA xA
Run Code Online (Sandbox Code Playgroud)
?()当和*()用于匹配后缀模式时(使用%和) ,会报告相同的行为%%:
$ echo …Run Code Online (Sandbox Code Playgroud) 在perl中运行exec时,我无法将输出重定向到文件.
我在exec中运行vlc但是因为我怀疑每个人都设置了我已经用下面的echo替换它,它显示了相同的行为示例.
我只对exec'命令'感兴趣,'args'格式的exec不是那个产生shell的格式,因为它生成了一个带有vlc的子shell,它仍会打印到屏幕+其他问题,干净地杀死它.
use strict;
use warnings;
my $pid = fork;
if (!defined $pid) {
die "Cannot fork: $!";
}
elsif ($pid == 0) {
exec "/usr/bin/echo","done";
}
Run Code Online (Sandbox Code Playgroud)
exec "/usr/bin/echo","done",">/dev/null";
Run Code Online (Sandbox Code Playgroud)
正如预期的那样只打印">/dev/null",但值得一试.
exec "/usr/bin/echo done >/dev/null";
Run Code Online (Sandbox Code Playgroud)
运行sh然后运行echo,在这里工作,但不是我在vlc的实际问题,我想我会包括,因为有人肯定会建议它.
当使用'command','args'到文件时,如何重定向此exec的输出?
如需更多信息,请询问.
除非我从管道打印实际数据,否则为什么在使用匿名管道时没有打印?
use strict;
use warnings;
my $child_process_id = 0;
my $vmstat_command = 'vmstat 7|';
$child_process_id = open(VMSTAT, $vmstat_command) || die "Error when executing \"$vmstat_command\": $!";
while (<VMSTAT>) {
print "hi" ;
}
close VMSTAT or die "bad command: $! $?";
Run Code Online (Sandbox Code Playgroud)
似乎挂了
use strict;
use warnings;
my $child_process_id = 0;
my $vmstat_command = 'vmstat 7|';
$child_process_id = open(VMSTAT, $vmstat_command) || die "Error when executing \"$vmstat_command\": $!";
while (<VMSTAT>) {
print "hi" . $_ ;
# ^^^ Added this
} …Run Code Online (Sandbox Code Playgroud) 我意识到这个问题已经存在,但解决方案实际上并没有改变分隔符。我想知道是否可以更改分隔符,或者是否有人知道它所在的位置。
假设我需要将此字符串传递给程序,以逗号分隔,因为这是程序接受的
echo \"abc" "{def,ghi}\"
Run Code Online (Sandbox Code Playgroud)
印刷
"abc def" "abc ghi"
Run Code Online (Sandbox Code Playgroud)
我想要的地方
"abc def","abc ghi"
Run Code Online (Sandbox Code Playgroud)
显然,这只是一个简单的例子。
没有什么,因为我不知道在哪里寻找这个分隔符,尽管我已经进行了广泛的搜索
也作为一个子问题:
尝试使用 choroba 的另一个问题的答案将其传递给我的脚本时会产生错误。诚然,我还没有尝试过很长时间
我试过
./script ( set abc" "{def,ghi} ; IFS=: ; echo "$*" )
./script < <( set abc" "{def,ghi} ; IFS=: ; echo "$*" )
./scipt $(( set abc" "{def,ghi} ; IFS=: ; echo "$*" ))
Run Code Online (Sandbox Code Playgroud) 不要认为这应该有所作为,但无论如何我都会包括它
GNU bash,版本3.2.51
所以说我有一个包含多个部件的管道,如何防止部分管道在前一个部件完成之前运行.
在下面的例子中,我将尝试显示问题
$ echo hello | tee /dev/tty | (echo "Next";sed 's/h/m/' )
Run Code Online (Sandbox Code Playgroud)
产量
Next
hello
mello
Run Code Online (Sandbox Code Playgroud)
用睡眠来表明它是关闭的时间
$ echo hello | tee /dev/tty | (sleep 2;echo "Next";sed 's/h/m/' )
Run Code Online (Sandbox Code Playgroud)
产量
hello
Next
mello
Run Code Online (Sandbox Code Playgroud)
如上所述
hello
Next
mello
Run Code Online (Sandbox Code Playgroud)
但显然这取决于睡眠时间长于前一个命令完成所需的时间,这不是我想要的.
我知道有更好的方法可以做到这一点,但我认为让我了解管道的工作方式对我来说很有教育意义.
尝试等待和睡眠的变化和事情,但没有一致的工作.
这仍然打印下一个虽然
$ echo hello | tee /dev/tty | sort |(echo "Next";sed 's/h/m/' )
Next
hello
mello
$ echo hello | tee /dev/tty | tac | tac |(echo "Next";sed 's/h/m/' …Run Code Online (Sandbox Code Playgroud) 我有一个哈希/数组结构,但是有些哈希键不是在相同的情况下.
我想知道是否有办法处理这种情况,而无需手动检查每个哈希的键.
在下面的示例中,我希望打印所有ID/iD/id/Id字段.
use warnings;
use strict;
my $Hash = {
Server => [
{
Id=>123
},
{
iD=>456
},
{
ID=>789
}
]
};
for (@{$Hash->{Server}}){
print "$_->{ID}\n"
#This is the problematic part
}
Run Code Online (Sandbox Code Playgroud)
perl版本:v5.10.0
这些数据从其他地方收到并且必须保持相同的情况,上面的例子是最小的,我不能简单地将它们全部更改为相同的情况.
需要更多信息让我知道.
我有一个关于我以前的成功回答问题一个问题在这里通过@fedorgui.
我有一张桌子:
pac1 xxx
pac1 yyy
pac1 zzz
pac2 xxx
pac2 uuu
pac3 zzz
pac3 uuu
pac4 zzz
Run Code Online (Sandbox Code Playgroud)
我需要像这样计算输出:
pac1 xxx 2/4
pac1 yyy 1/4
pac1 zzz 3/4
pac2 xxx 2/4
pac2 uuu 2/4
pac3 zzz 2/4
pac3 uuu 2/4
pac4 zzz 3/4
Run Code Online (Sandbox Code Playgroud)
第一列中的第一个数字是第二列中的唯一出现次数(在这种情况下,xxx在第二列中出现2,而uniq第一列出现在第二列中 4 => 2/4
解决方案在awk中工作在这里:
$ awk 'FNR==NR {col1[$1]++; col2[$2]++; next} {print $0, col2[$2] "/" length(col1)}' file file
Run Code Online (Sandbox Code Playgroud)
但我的输入可能有重复的行,如:
pac1 xxx
pac1 xxx
pac1 xxx
pac1 yyy
pac1 zzz
pac2 xxx
pac2 xxx
pac2 xxx …Run Code Online (Sandbox Code Playgroud) 哈希值在(每个)循环中打印两次.
use strict;
use warnings;
my %Hash;
my $x=1;
foreach my $item( 1..9 ) {
$Hash{$x} = $x;
print scalar keys %Hash,",$item,",$x++,"\n"
}
$x=1;
foreach my $iteml( %Hash){
print $x++,"\n";
print "||||$iteml------$Hash{$iteml}||||\n";
}
print "@{[%Hash]}\n";
Run Code Online (Sandbox Code Playgroud)
1,1,1
2,2,2
3,3,3
4,4,4
5,5,5
6,6,6
7,7,7
8,8,8
9,9,9
1
||||6------6||||
2
||||6------6||||
3
||||3------3||||
4
||||3------3||||
5
||||7------7||||
6
||||7------7||||
7
||||9------9||||
8
||||9------9||||
9
||||2------2||||
10
||||2------2||||
11
||||8------8||||
12
||||8------8||||
13
||||1------1||||
14
||||1------1||||
15
||||4------4||||
16
||||4------4||||
17 …Run Code Online (Sandbox Code Playgroud)