打印特定字母“ls -1”命令[bash,sed,awk,grep]

时间:2013-11-09 00:21:37

标签: bash sorting sed awk grep

美好的一天!

我想知道如何打印以下输出的特定字母:

ls -1 *Mcmm*txt *Mmmm*txt

它给出了:

Mcmm_E.txt
Mcmm_M.txt
Mmmm_E.txt
Mmmm_M.txt

我想获得:

E
M
E
M

提前感谢任何建议

6 个答案:

答案 0 :(得分:2)

你可以试试这个。它打印基于_.的最后一个字段作为分隔符(假设您需要在最后_.之间打印所有内容并假设在那里是每个文件名中.的一个实例)

ls -1 *Mcmm*txt *Mmmm*txt | awk -F'_|\\.' '{print $(NF-1)}'

答案 1 :(得分:2)

ls -1 *Mcmm*txt *Mmmm*txt | cut -b6

打字比使用awk少得多......

cut -b6选择每行的第6个字节。

答案 2 :(得分:2)

你应该总是避免解析ls;见here。请改用find

find . -type f -name '*M[cm]mm*.txt' -print0

如果你有gnu grep,你可以输入:

grep -oPz '[^_](?=.txt)'

结果:

E
E
M
M

答案 3 :(得分:1)

另一个awk

ls -1 *Mcmm*txt *Mmmm*txt | awk -F"[_.]" '{print $2}'
E
M
E
M

答案 4 :(得分:1)

不解析ls的输出。在您的特定情况下,如果您只想打印与您的模式匹配的每个文件名的第六个字符,请执行以下操作:

files_ary=( *Mcmm*txt *Mmmm*txt )
for f in "${files_ary[@]}"; do
    printf '%s\n' "${f:5:1}"
done

要仅打印.txt前面的角色,一个有趣的可能性是:

files_ary=( *Mcmm*.txt *Mmmm*.txt )
for f in "${files_ary[@]%.txt}"; do
    printf '%s\n' "${f: -1}"
done

这些方法是100%纯粹的bash,即使文件名(空格,换行符等)中有滑稽符号,它们也能正常工作。哦,为了100%安全,不要忘记使用shopt -s nullglob

答案 5 :(得分:0)

ls -1 *Mcmm*txt *Mmmm*txt | sed -u "s/^.\{5\}\(.\).*/\1/"

-u用于流处理(avoir缓存在巨大的文件夹上)

我认为cut会更快

在这种情况下,即使在ls

中使用*,也不会处理第一个字符