如何在 shell 脚本和命令行中将输出限制为“n”个字符

如何在 shell 脚本和命令行中将输出限制为“n”个字符

这是我的脚本:

echo "Enter a file name:\c "
read input
if [ -f $input ]
then
echo "line words chars:\c "
'echo wc $input'
fi

输出符合预期

lines words chars: 4 20 3 test

其中 test 是文件名

但问题是我不想输出文件名

不仅仅是这个例子,我想将它应用于许多这样的脚本

答案1

以下是我的做法:

printf "Enter a file name: " 
read input 
if [ -f "$input" ] ; then 
    printf "line words chars: %s\n" "$(wc -lwm < "$input")"
fi

答案2

就你的情况而言,我认为将输出限制为一定长度并不好,因为你的wc输出可能有不同的长度。但是,你可以使用以下命令来实现这一点cut

将脚本的最后一行更改为

wc "$input" | cut -c 1-6

这将仅输出前 6 个字符。


我相信你最好使用这个:

wc "$input" | sed -e s/"$input"$//

这将从输出中删除变量的内容$input(在您的情况下是文件名)。此版本忽略输出长度,也可以处理更长的输出字符串。

[编辑]:
第二条命令的解释:

wc "$input"   #-> wc command as used before
|             #-> redirect output of wc to the next command
sed -e        #-> call the program "sed" with the following expression
s/"$input"$// #-> replace everything between / 1 and 2 with everything between / 2 and 3
              #->in this case: replace filename with nothing. The second "$" represents the end of the line (so the filename has to be the last element of the line)

顺便说一句,您的脚本中还有其他一些错误:

echo "Enter a file name:\c "  -> you don't need the \c
read input              
if [ -f $input ]              -> you should always quote variables
then
echo "line words chars:\c "
'echo wc $input'              -> you should not use echo and '' here, if you want to execute wc
                              -> you are missing a "fi"

所以这个代码应该可以工作:

echo "Enter a file name:"
read input
if [ -f "$input" ]
then
  echo "line words chars:"
  wc "$input"
fi

答案3

这个问题的关键在于wc针对作为参数给出的文件读取其内容的行为,以及针对stdin流的行为。

wc有一个文件作为参数时,它将打印该参数以及计数

$>  wc < /etc/passwd 
  49   75 2575
$>  cat /etc/passwd | wc                                
     49      75    2575
$>  wc /etc/passwd                                               
  49   75 2575 /etc/passwd

您始终可以使用 AWK、cut 或 grep 等工具修剪 的输出wc FILENAME,但这不是必需的。说到AWK,人们可以用它做这样的事情:

$> awk 'BEGIN{ print "Enter filename:" ; getline ; system("wc <"$0)  }'        
Enter filename:
/etc/passwd
  49   75 2575

但典型的 shell 脚本看起来是这样的:

$> echo 'Give me a file' ; read LINE; echo $LINE | xargs wc                                    
Give me a file
/etc/passwd
  49   75 2575 /etc/passwd
$> echo 'Give me a file' ; read LINE; wc < "$LINE"                                             
Give me a file
/etc/passwd
  49   75 2575

顺便说一句,不需要检查文件是否存在。你的 shell 或者wc已经这样做了:

$> echo 'Give me a file' ; read LINE; wc < "$LINE"                                             
Give me a file
asdf
/bin/mksh: can't open asdf: No such file or directory

相关内容