如何在最后一个下划线字符处剪切字符串?

pos*_*bie 0 ls bash awk text-processing command

我有如下文件列表:

\n
[root@ods1 backup]# ls -l\ntotal 93892810\n-rw-r----- 1 root root 651248 Feb 17 08:34  abc_def_g_17-02-2022.sql\n-rw------- 1 root root 665248 Mar 23 08:46  bbc_23-03-2022.sql\n-rw-r----- 1 root root 676992 Apr 04 16:52  zz_b_04-04-2022.sql\n
Run Code Online (Sandbox Code Playgroud)\n

我需要实现的是:

\n
abc_def_g\nbbc\nzz_b\n
Run Code Online (Sandbox Code Playgroud)\n

我尝试这样做,但没有成功:

\n
ls -l | awk '{print $9}' | cut -d '_' -f1-2\n
Run Code Online (Sandbox Code Playgroud)\n

我怎样才能实现这个目标?任何获取直到最后一个_字符的行的命令都可以完成这项工作。

\n

编辑:此命令在 CentOS\xc2\xa08 中执行。

\n

pLu*_*umo 6

要不解析ls,您可以使用简单的loopandshell语法:

for f in *; do echo "${f%_*}"; done
Run Code Online (Sandbox Code Playgroud)

如果您需要进一步处理该列表(并且您有一个能够使用数组的 shell),您可以将项目添加到数组中:

tokens=()
for f in *; do tokens=("${tokens[@]}" "${f%_*}"); done
echo "${tokens[@]}"
Run Code Online (Sandbox Code Playgroud)

或者不使用循环,直接声明数组:

files=(*)
tokens=("${files[@]%_*}")
#or
for token in "${files[@]%_*}"; do echo "$token"; done
Run Code Online (Sandbox Code Playgroud)