Exibe o número de bytes, palavras e linhas em um arquivo

1

Eu quero criar um script de shell df . Como, eu quero digitar df name_of_file e então eu posso pegar o conteúdo do arquivo.

Se o nome do arquivo estiver no diretório, quero que ele mostre seu conteúdo. Se não, eu quero mostrar o tamanho em palavras, linhas e bytes. Como eu faço isso? Até agora eu tenho isto:

#!/bin/bash
FILENAME=$FILENAME
FILEBYTES=$(stat -c%s "$FILENAME")
FILEWORDS=$(stat -w%s "$FILENAME")
FILELINES=$(stat -l%s "$FILENAME")
echo "Size of $FILENAME in bytes = $FILEBYTES  bytes, $FILEWORDS words, $FILELINES lines."
    
por Gary 02.11.2013 / 02:53

2 respostas

2

Eu faria assim:

#!/bin/bash

FILENAME=$1

[ -f "$FILENAME" ] || exit

FILEBYTES=$(stat -c%s "$FILENAME")
FILEWORDS=$(wc -w "$FILENAME" | awk '{print $1}')
FILELINES=$(wc -l "$FILENAME" | awk '{print $1}')

printf "Size of %s -- %s bytes, %s words, %s lines.\n" \
        "$FILENAME" "$FILEBYTES" "$FILEWORDS" "$FILELINES"

Exemplo

Digamos que eu tenha este arquivo:

$ ls -l | grep bbbb
-rw-rw-r--   1 saml saml    3283 May 18 02:49 bbbb

Agora eu corro o seu script, chamei-o de df.bash . O comando df já está no Unix:

$ ./df.bash bbbb 
Size of bbbb -- 3283 bytes, 386 words, 94 lines.

Procure um arquivo que não existe:

$ ./df.bash bbbbbbb
$ 

Método alternativo

Você pode salvar algumas chamadas perdidas consolidando e tendo awk fazendo a contagem em vez de wc .

#!/bin/bash

FILENAME=$1

[ -f "$FILENAME" ] || exit

FILEBYTES=$(stat -c%s "$FILENAME")
FILEWORDS=$(awk '{ total = total + NF }; END {print total}' "$FILENAME")
FILELINES=$(awk 'END {print NR}' "$FILENAME")

printf "Size of %s -- %s bytes, %s words, %s lines.\n" \
        "$FILENAME" "$FILEBYTES" "$FILEWORDS" "$FILELINES"
    
por 02.11.2013 / 03:35
2

Você está pedindo por isso?

 #! /bin/bash
 if [[ -f $(basename "$1") ]]
    then
       cat "$1"
    else
       wc -w -l -c "$1"
 fi

A propósito, df já é um comando para exibir o uso do espaço em disco. É melhor chamar seu roteiro de outra coisa.

    
por 02.11.2013 / 03:33

Tags