cut 的逆命令是否存在?

cut 的逆命令是否存在?

我喜欢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仅用作示例并将解析其他内容,有几种方法可以实现您想要的功能:

  1. 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>barfoo<space><space>bar不同。

  2. awk及其变体将每个输入行分割成空白字段,这样你就可以告诉它只打印你想要的字段:

    awk '{print $1,$2,$3,$4,$9}'
    
  3. 珀尔

    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。 /秒

相关内容