小编use*_*168的帖子

文件描述符未生成

我在shell脚本中遇到问题.我缩小了问题的范围,发现这是因为标准输入的文件描述符不是在proc文件系统中生成的.下面是我编写的测试脚本:

#!/bin/ksh


var=`ls -lrt /proc/$$/path/0`
echo $var


if [[  -f /proc/$$/path/0 ]]
then
echo "found file descriptor"
else
echo "file descriptor not found"
fi
Run Code Online (Sandbox Code Playgroud)

我在/ tmp /目录中使用示例输入文件对此进行了测试:

$ ./checkip.sh < /tmp/testip
lrwxrwxrwx 1 root root 0 Dec 31 09:15 /proc/19358/path/0 -> /tmp/testip
found file descriptor
Run Code Online (Sandbox Code Playgroud)

现在我在我们遇到问题的目录中进行了测试.

$ ./checkip.sh < /var/opt/xxxxxxxx/testip
lrwxrwxrwx 1 root root 0 Dec 31 09:15 /proc/20124/path/0
file descriptor not found
$
Run Code Online (Sandbox Code Playgroud)

我想可能是目录xxxxxxxx.所以我再次使用父目录中的文件对此进行了测试.

$ ./checkip.sh < /var/opt/testip
lrwxrwxrwx 1 root root 0 Dec 31 09:16 /proc/21286/path/0 -> /var/opt/testip …
Run Code Online (Sandbox Code Playgroud)

unix shell ksh solaris

5
推荐指数
1
解决办法
141
查看次数

在perl中使用正则表达式匹配创建哈希

可以说我有一个如下文件:

我想将所有十进制数存储在哈希中.

hello world 10 20
world 10 10 10 10 hello 20
hello 30 20 10 world 10
Run Code Online (Sandbox Code Playgroud)

我在看这个

这工作得很好:

> perl -lne 'push @a,/\d+/g;END{print "@a"}' temp
10 20 10 10 10 10 20 30 20 10 10
Run Code Online (Sandbox Code Playgroud)

那么我需要的是计算每个正则表达式的出现次数.

为此我认为最好将所有匹配存储在哈希中,并为每个键分配一个递增值.

所以我试过了:

perl -lne '$a{$1}++ for ($_=~/(\d+)/g);END{foreach(keys %a){print "$_.$a{$_}"}}' temp
Run Code Online (Sandbox Code Playgroud)

这给了我一个输出:

> perl -lne '$a{$1}++ for ($_=~/(\d+)/g);END{foreach(keys %a){print "$_.$a{$_}"}}' temp
10.4
20.7
Run Code Online (Sandbox Code Playgroud)

不管我错了,有人能纠正我吗?

我期望的输出是:

10.7
20.3
30.1
Run Code Online (Sandbox Code Playgroud)

虽然我可以在awk中执行此操作,但我只想在perl中执行此操作

输出的顺序也不是我关心的问题.

perl

3
推荐指数
1
解决办法
1790
查看次数

使用join比较unix中的两个文件

我正在研究solaris unix.我有两个文件:

> cat temp
2
8
6
> cat temp2
1
2
3
4
5
6
7
8
9
> 
Run Code Online (Sandbox Code Playgroud)

现在我需要temp2中存在的temp2中的所有行:我遇到了这个并尝试了下面的命令.

> nawk 'FNR==NR{a[$0];next}($1 in a)' temp temp2
2
6
8
>
Run Code Online (Sandbox Code Playgroud)

这完美地运作了.然后我也看到了在这里使用join的方式, 其中的内容(以及手册页)"默认情况下,当我们没有明确指定字段编号时,join命令匹配第一个字段上的文件"所以我认为如果我给join temp temp2我,我会得到

2
6
8
Run Code Online (Sandbox Code Playgroud)

但是我得到了!

> join temp temp2
2
8
>
Run Code Online (Sandbox Code Playgroud)

如果默认加入匹配第一列,有人可以告诉我为什么6会丢失吗?

unix shell awk join

2
推荐指数
1
解决办法
1977
查看次数

处理perl中的复杂哈希值

我有简单的perl脚本如下:

#!/usr/bin/perl
use strict;
use Data::Dumper;
my %x;

$x{"a"}="b";
$x{"b"}={'c'=>3,'d'=>4};
$x{"c"}={'e'=>{'f'=>5,'g'=>6},'h'=>{'i'=>7,'j'=>8}};

print Dumper(%x);
Run Code Online (Sandbox Code Playgroud)

这输出如下:

> ./temp.pl
$VAR1 = 'c';
$VAR2 = {
          'e' => {
                   'g' => 6,
                   'f' => 5
                 },
          'h' => {
                   'j' => 8,
                   'i' => 7
                 }
        };
$VAR3 = 'a';
$VAR4 = 'b';
$VAR5 = 'b';
$VAR6 = {
          'c' => 3,
          'd' => 4
        };
,
Run Code Online (Sandbox Code Playgroud)

但我想要的输出是不同的.所以我尝试了下面的代码:

#!/usr/bin/perl

use strict;
use Data::Dumper;
my %x;

$x{"a"}="b";
$x{"b"}={'c'=>3,'d'=>4};
$x{"c"}={'e'=>{'f'=>5,'g'=>6},'h'=>{'i'=>7,'j'=>8}};

foreach (keys %x )
{
        if(ref($x{$_}) …
Run Code Online (Sandbox Code Playgroud)

perl hash hash-of-hashes

2
推荐指数
1
解决办法
186
查看次数

shell变量旁边的连字符是什么

我在一些脚本中看到有一个连接到shell变量的连字符.例如:

if [ -z ${X-} ]
Run Code Online (Sandbox Code Playgroud)

变量旁边的这个连字符符号在这里做什么.我在网上找不到任何相关文档.

bash shell scripting

2
推荐指数
1
解决办法
446
查看次数

标签 统计

shell ×3

perl ×2

unix ×2

awk ×1

bash ×1

hash ×1

hash-of-hashes ×1

join ×1

ksh ×1

scripting ×1

solaris ×1