Como tornar uma saída limitada a 'n' caracteres no shell script e também na linha de comando

0

Este é o meu script:

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

A saída é a esperada

lines words chars: 4 20 3 test

em que test é um nome de arquivo

mas o problema é que eu não quero produzir um nome de arquivo

não apenas para este exemplo eu quero aplicá-lo para muitos desses scripts

    
por arvind 26.02.2016 / 11:31

3 respostas

3

Aqui está como eu faria:

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

No seu caso, não acredito que seja bom restringir a saída a um determinado tamanho, porque sua saída wc pode ter comprimentos diferentes. No entanto, você poderia fazer isso usando cut :

Altere a última linha do seu script para

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

Isso só produzirá os 6 primeiros caracteres.

Eu acredito, é melhor você usar isso:

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

Isso removerá o conteúdo da variável $input (no seu caso, o nome do arquivo) da saída. Esta versão ignora o tamanho da saída e pode lidar com sequências de saída mais longas também.

[edit]:
Explicação do segundo comando:

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)

A propósito, existem alguns outros erros no seu script:

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"

para que esse código funcione:

echo "Enter a file name:"
read input
if [ -f "$input" ]
then
  echo "line words chars:"
  wc "$input"
fi
    
por Wayne_Yux 26.02.2016 / 11:54
1

A chave para essa questão é o comportamento wc em relação a um arquivo fornecido como argumento para ler seu conteúdo e com relação a stdin stream.

Quando wc tiver um arquivo como argumento, ele imprimirá esse argumento junto com a contagem

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

Você sempre pode cortar a saída de wc FILENAME com ferramentas como AWK, cut ou grep, mas isso não é necessário. Falando de AWK , pode-se fazer algo assim com isso:

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

Mas o script de shell típico ficará assim:

$> 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

A propósito, não há necessidade de verificar se existe um arquivo. Seu shell ou wc já fazem isso:

$> 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
    
por Sergiy Kolodyazhnyy 26.02.2016 / 15:59