我一直看到引用此链接的答案明确指出“不要解析ls
!” 这让我感到困扰有几个原因:
似乎该链接中的信息已被批量接受,几乎没有问题,尽管我可以在随意阅读中至少挑出一些错误。
该链接中所述的问题似乎也引发了不想找到解决方案的愿望。
从第一段:
...当你要求
[ls]
一个文件列表时,有一个大问题:Unix 允许文件名中的几乎任何字符,包括空格、换行符、逗号、管道符号,以及几乎任何你曾经尝试用作除 NUL 外的分隔符。...ls
用换行符分隔文件名。这很好,直到您的文件名称中包含换行符。并且由于我不知道任何ls
允许您使用 NUL 字符而不是换行符终止文件名的实现,这使我们无法使用ls
.
无赖,对吧?如何以往我们可以处理一个换行符终止的上市数据集可能包含换行符的数据?好吧,如果这个网站上回答问题的人不是每天都做这种事情,我可能会认为我们遇到了麻烦。
事实是,大多数ls
实现实际上提供了一个非常简单的 api 来解析它们的输出,我们一直在做,甚至没有意识到。您不仅可以以 null 结束文件名,还可以以 null 或您可能需要的任何其他任意字符串开头。更重要的是,您可以为每个文件类型分配这些任意字符串。请考虑:
LS_COLORS='lc=\0:rc=:ec=\0\0\0:fi=:di=:' ls -l --color=always | cat -A
total 4$
drwxr-xr-x 1 mikeserv mikeserv 0 Jul 10 01:05 ^@^@^@^@dir^@^@^@/$
-rw-r--r-- 1 mikeserv mikeserv 4 Jul 10 02:18 ^@file1^@^@^@$
-rw-r--r-- 1 mikeserv mikeserv 0 Jul 10 01:08 ^@file2^@^@^@$
-rw-r--r-- 1 mikeserv mikeserv 0 Jul …
Run Code Online (Sandbox Code Playgroud) 在 2013-01-10 Glenn Fowler 将此发布到ast-users 邮件列表:
正如在 AST 和 UWIN 列表中多次指出的那样,AT&T 对 OpenSouce 软件的支持很少,这就是为什么我们很少有人参与我们相当大的 AST 软件集合。尽管如此
ksh
,nmake
、vczip
、UWIN
和其他 AST 工具仍在几个 AT&T 项目中继续使用。事实证明,软件并不是唯一缺乏支持的东西:dgk (David Korn)(AT&T 研究员,服务 36 年)和 gsf (Glenn Fowler)(AT&T 研究员,服务 29 年)都已终止,10 月生效10. 我们的第三个主要合作伙伴 Phong Vo(AT&T 研究员,服务 32 年)几个月前离开了 Google。UWIN 维护者 Jeff Fellin 仍在 AT&T 工作,并为一些关键操作提供 UWIN 支持。
dgk 和 gsf 都将继续在 AST 软件上工作,并且实际上可能有更多的时间(至少在短期内)专注于它。
下载站点和邮件组将至少在接下来的几个月内保留在 AT&T 中。我们的 AT&T 同事 dr.ek,AST 用户和错误检测器,将维护该站点。我们已经保护了 astopen.org 域,并且正在研究非 AT&T 托管选项,包括带有错误跟踪功能的存储库。
改变的过程需要时间;用户社区的耐心将不胜感激。在一个基本上稳定了近 30 年的环境中工作后,有 …
但他们给出的指令是
cd downloaded_program
./configure
make install
Run Code Online (Sandbox Code Playgroud)
这将创建所需的 ELF,可能还有一些 .so 文件。
为什么不把它们放在一个 zip 文件中进行下载,就像 Windows 应用程序一样?有什么理由需要用户编译它们吗?
我一直想知道这一点,但从来没有花时间去了解,所以我现在就这样做 -此处显示的/proc/$$/fd/$N
或的用法有多便携/dev/fd/$N
?我理解POSIX 保证 /dev/null, /dev/tty, and /dev/console
(尽管我前几天在阅读了这个答案的评论后才发现这一点)但是其他的呢?
据我所知,它们很常见,但我不能指望在哪些系统中找到它们?为什么不?找到一个比另一个更有可能吗?他们会总是表现出类似的属性吗?
我倾向于以各种方式广泛使用这些设备,我想知道是否有机会尝试一下。
此外,上述问题应该被理解为只是我想我想知道的,但是,因为我显然首先要问,所以我在这方面可能不是最了解的,它们不应该被视为严格的要求一个答案。如果可以,请告诉我。
我最近对各种基于 Linux 内核内存的文件系统很好奇。
Note:
就我而言,与更好地理解标题中提出的问题相比,以下问题或多或少应该被视为可选问题。我在下面问他们,因为我相信回答他们可以更好地帮助我理解差异,但由于我的理解是有限的,因此其他人可能更了解。我准备接受任何可以丰富我对标题中提到的三个文件系统之间差异的理解的答案。
最终,我想我想挂载一个可用的文件系统,hugepages,
尽管一些轻量的研究(以及更轻量的修补)让我相信 arewritable hugepage mount
不是一种选择。我错了吗?这里的机制是什么?
还有关于 hugepages:
uname -a
3.13.3-1-MANJARO \
#1 SMP PREEMPT \
x86_64 GNU/Linux
tail -n8 /proc/meminfo
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
DirectMap4k: 8223772 kB
DirectMap2M: 16924672 kB
DirectMap1G: 2097152 kB
Run Code Online (Sandbox Code Playgroud)
(这里是/proc/meminfo和/proc/cpuinfo的全文版本)
以上是怎么回事?难道我已经分配hugepages?
有之间的差异DirectMap
内存页面和hugepages?
更新在@Gilles 的推动下,我在上面又添加了 4 行,似乎必须有所不同,尽管我DirectMap
在tail
昨天拉之前从未听说过......也许DMI
还是什么?
只是多一点...
hugepages
努力失败,并假设任何图像文件的硬盘备份,挂载循环的风险tmpfs?
是swapped
什么?我的文件系统是最坏的情况吗?我知道tmpfs
是挂载的文件系统缓存 - …
我知道 Linux 命名空间,除此之外,还可以用来安全地处理限制和监禁子进程,而不会让它们被僵尸化和转储到init
. 但我对实现细节很模糊。我如何使用util-linux
诸如mount
and提供的工具nsenter
来监视、监视和确保启动的所有进程都是另一个进程的直接命名空间后代?
在这个编辑中,
Stéphane Chazelas 通过插入一个xpression 中断和另一个xpression语句 (再次)POSIXifying我的sed
格式。现在,我可能只是在评论中问他为什么,我想,但它已经是该答案的修订号 18,并且几乎所有以前的都已经感谢类似的免费赠品(如果您可以看到已删除的评论,您就会知道是什么我的意思是)。此外,我认为我已经足够理解为什么要以一种可能更普遍有用的方式来表达这一点。所以在这里希望...-e
-e
sed
-e
如果可能的话,我通常更喜欢将我的总xpressions保持为一个,但我也更倾向于尽可能接近规范,尤其是当差异不超过 a<space>
和 an 时-e
。但是如果我不明白为什么我应该这样做,我就不能这样做。以下是我理解的当前状态的简要概述:
在' -e '
休息能够方便地站在了一个sed
脚本\n
在ewline突破sed
命令行语句......我承认模糊为什么
sed
{
函数中}
的\n
右大括号前面必须有一个ewline 中断,如下所述:
<right-brace>
前面应有 a<newline>
并且可以前面或后面跟有<blank>
字符。\n
任何使用... , , , , , , , 或 之后,同样需要一个ewline 中断。a
b …
我正在使用 sed、perl、awk、bash 在 mac 上工作。
我有一个大型 (10GB) 文本文件,其中包含 13 个TAB
分隔数据字段(列)。不幸的是,其中一些行有无关的TABs
,所以我想删除我们有额外 TABs
字段的整行,因此不相等的字段。(我不介意完全丢弃这些线条)
我目前拥有的将字段数写入另一个文件。
awk -F'\t' '{print NF}' infile > fieldCount
head fieldCount
13
13
10
13
13
13
14
13
13
13
Run Code Online (Sandbox Code Playgroud)
我想构建一个简短的脚本,删除包含多于(或少于)13 个适当字段(来自原始文件)的任何行。
编辑:
有效(13 列)
a b c d e f g h i j k l m
Run Code Online (Sandbox Code Playgroud)
无效(14 列)
a b c d e f g h i j k l m n
Run Code Online (Sandbox Code Playgroud) 所以,一般来说,我倾向于寻找sed
文本处理 - 特别是对于大文件 - 通常避免在 shell 本身中做这些事情。
不过,我认为这可能会改变。我在四处闲逛,man ksh
我注意到了这一点:
<#pattern Seeks forward to the beginning of the
next line containing pattern.
<##pattern The same as <# except that the por?
tion of the file that is skipped is
copied to standard output.
Run Code Online (Sandbox Code Playgroud)
对现实世界的实用性持怀疑态度,我决定尝试一下。我做了:
seq -s'foo bar
' 1000000 >file
Run Code Online (Sandbox Code Playgroud)
...对于一百万行数据,如下所示:
1foo bar
...
999999foo bar
1000000
Run Code Online (Sandbox Code Playgroud)
...并将其与以下内容相提并论sed
:
p='^[^0-8]99999.*bar'
for c in "sed '/$p/q'" "ksh -c ':<##@(~(E)$p)'"
do </tmp/file eval "time ( $c )"
done …
Run Code Online (Sandbox Code Playgroud) 为什么这个 shell 脚本打印输入两次?
我希望脚本在 5 之后忽略输入。
脚本:
#! /bin/bash
echo "Enter 5 words : "
read a b c d e
printf "> %s %s %s %s %s <" $a $b $c $d $e
Run Code Online (Sandbox Code Playgroud)
输出:
user@linux:~$ pico ifs2.sh
user@linux:~$ ./ifs2.sh
Enter 5 words :
1 2 3 4 5
> 1 2 3 4 5 <user@linux:~$ ./ifs2.sh
Enter 5 words :
1 2 3 4 5 6
> 1 2 3 4 5 <> 6 <user@linux:~$ ./ifs2.sh
Enter 5 words …
Run Code Online (Sandbox Code Playgroud) shell ×3
ksh ×2
process ×2
sed ×2
awk ×1
columns ×1
development ×1
elf ×1
filesystems ×1
history ×1
linux ×1
ls ×1
make ×1
memory ×1
namespace ×1
open-files ×1
portability ×1
posix ×1
proc ×1
shell-script ×1
source ×1
tmpfs ×1