【问题标题】:getting "ksh: no space"-error when running a unix command运行 unix 命令时出现“ksh: no space”-错误
【发布时间】:2014-05-25 03:16:16
【问题描述】:

我有一个文本文件WIDeletion2.txt,其示例文本如下。

$ head WIDeletion2.txt
5A1E7DF7C1C8BC4497FE3AD68954EF21 VA_ITSHOME
294A07B8ABDC454FABD0CD488B3FA51B VA_ITSHOME
C15A689952E4A14993B4787020258AEA VA_ITSHOME
C3E8CFE6FFBD3A45B37336D270940AC8 VA_ITSHOME
F69955919630784EB41FE8D0BE2A260F VA_ITSHOME
DD044FFD70FDED46AEA9205DA3435B24 VA_ITSHOME
0C678B5BC6531140BE92F40A0B727012 VA_ITSHOME

它包含大约 90k 行这样的行。我想在每行的开头添加deletedwob,在每行的末尾添加" y y"(不带引号)。

我正在尝试通过以下方式实现这一目标(在 AIX 上):

$ for i in `cat WIDeletion2.txt`
> do
> echo deletewob $i y y >> WIDeletion3.txt
> done
ksh: no space

我收到ksh: no space 错误。我也验证了/tmp 的空间。大约有 600mb 可用空间,WIDeletion2.txt 的大小如下。

$ ls -ltr WI*
-rw-rw-r--    1 fnsw     fnusr       3390146 Apr 10 10:50 WIDeletion2.txt

df 挂载/tmp 是:

$ df -m /tmp
Filesystem    MB blocks      Free %Used    Iused %Iused Mounted on
/dev/hd3        1024.00    615.37   40%     1601     2% /tmp

因此,通过将这些额外的东西添加到文件中,它可以达到其大小的两倍或三倍,最大为 20 mb,我有 600 mb 的可用空间。我什至尝试将其放入脚本中,然后运行产生相同错误的脚本。任何想法为什么我会收到此错误?

【问题讨论】:

    标签: shell unix aix


    【解决方案1】:

    您的 shell 处理该循环的内存不足。 试试:

    sed -e 's,^,deletedwob ,' -e 's,$, y y,' WIDeletion2.txt > WIDeletion3.txt
    

    【讨论】:

    • 感谢这确实有效。但是你说的shell内存不足是什么意思。 shell的具体内存量是多少,我们如何检查它。?
    • 您需要检查ulimit -a 输出并查看为用户进程分配了多少堆栈空间。例如来自 AIX 机器:stack size (kbytes, -s) 32768。最大内存 (-m) 大小也可能会影响您的进程何时用完空间。对于@BMW 的回答,他的shell 方法没有使用带有反引号的for 循环。使用反引号时,shell 可能会将所有输出保存在堆栈中。
    【解决方案2】:

    /tmp 文件夹为所有人打开。

    使用 sed

    sed 's/.*/deletedwob& y y/' WIDeletion2.txt > WIDeletion3.txt
    
    deletedwob5A1E7DF7C1C8BC4497FE3AD68954EF21 VA_ITSHOME y y
    deletedwob294A07B8ABDC454FABD0CD488B3FA51B VA_ITSHOME y y
    deletedwobC15A689952E4A14993B4787020258AEA VA_ITSHOME y y
    deletedwobC3E8CFE6FFBD3A45B37336D270940AC8 VA_ITSHOME y y
    deletedwobF69955919630784EB41FE8D0BE2A260F VA_ITSHOME y y
    deletedwobDD044FFD70FDED46AEA9205DA3435B24 VA_ITSHOME y y
    deletedwob0C678B5BC6531140BE92F40A0B727012 VA_ITSHOME y y
    

    使用 awk

    awk '{printf "deletedwob%s y y\n",$0}' file
    

    使用外壳

    while read -r line; do echo "deletedwob${line} y y"; done < file
    

    【讨论】:

    • 你关于使用 shell 的最后一种方法,即使我试图只使用 shell,但我使用了 for 循环,这个和我的有什么区别,因为我的方法它说没有空格并在它确实有效时使用。但是这两种方法都只使用 shell。
    猜你喜欢
    • 2023-04-03
    • 2021-01-08
    • 2019-09-08
    • 2021-12-20
    • 2021-01-01
    • 2014-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多