我喜欢cut
在 Linux 中使用带-c
标志的命令。然而,我有兴趣找到一个命令来执行cut
.本质上,给定输入:
drwxrwxrwx 2 root root 4096 4096 4 20:15 bin
drwxrwxrwx 2 root root 4096 4096 4 20:15 Desktop
我想看到一切除了“4096 4 20:15”。这是输出:
drwxrwxrwx 2 root root bin
drwxrwxrwx 2 root root Desktop
我希望能够在字符 x 和 y 之间进行逐字剪切,如果这有意义的话。
有任何想法吗?我无法想象这会是一个很难编写的脚本,但如果已经存在一个命令,我很乐意使用它。
答案1
正如其他人指出的那样,你不应该解析的输出ls
。假设您ls
仅用作示例并将解析其他内容,有几种方法可以实现您想要的功能:
cut
与-d
和-f
cut -d ' ' -f 1,2,3,4,9
从
man cut
:-d, --delimiter=DELIM use DELIM instead of TAB for field delimiter -f, --fields=LIST select only these fields; also print any line that contains no delimiter character, unless the -s option is specified
特别是
ls
这可能会失败,因为ls
会改变连续字段之间的空白量以使它们更好地对齐。cut
对待foo<space>bar
和foo<space><space>bar
不同。awk
及其变体将每个输入行分割成空白字段,这样你就可以告诉它只打印你想要的字段:awk '{print $1,$2,$3,$4,$9}'
珀尔
perl -lane 'print "@F[0 .. 3,8]"'
答案2
cut
您可以使用该选项获得结果的倒数--complement
。这cut
手册页说(有点无益):
- 补充
complement the set of selected bytes, characters or fields
所以,举例来说,
$ echo The fifth and sixth words will be missing | cut -d ' ' -f 5-6 --complement The fifth and sixth be missing
解释:
-d ' '
将分隔符设置为空格字符-f 5-6
选择要输出的字段 5 到 6(“words will”)--complement
返回所选文本的补码(反码)
答案3
使用stat
替换ls
并不是直接替换,因此对于所有针对解析的善意警告ls
,我可以欣赏其中的诱惑......
ls -a
这几乎相当于当前目录中的 an :
find . -maxdepth 1 -print0|xargs -0 stat --format="%A %U %G %n"
这是我能得到的最近的:
find . -maxdepth 1 -print0\
|awk 'BEGIN{RS="\0";FS="/";ORS="\0"}{if(/\//){print $2}else{print}}'\
|xargs -0 stat --format="%A %U %G %n"\
|LC_COLLATE=C sort -k4
现在,要采用参数而不只是参数.
,您需要将其放入类似这样的函数中:
function ls4up() {
find . -maxdepth 1 -print0\
|awk 'BEGIN{RS="\0";FS="/";ORS="\0"}{if(/^[^\/][^\/]*\//){print $2}else{print}}'\
|xargs -0 stat --format="%A %U %G %n"\
|LC_COLLATE=C sort -k4
}
所以现在您会看到使用它是多么容易,stat
而不是尝试解析或其他东西的输出ls
。 /秒