Как сделать вывод ограниченным '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

где тест является именем файла

но проблема, я не хочу производить имя файла

не только для этого примера я хочу применить его для многих таких сценариев

0
задан 26 February 2016 в 16:22

3 ответа

Вот то, как я сделал бы это:

printf "Enter a file name: " 
read input 
if [ -f "$input" ] ; then 
    printf "line words chars: %s\n" "$(wc -lwm < "$input")"
fi
3
ответ дан 29 September 2019 в 11:25

В Вашем случае я не полагаю, что хорошо ограничить вывод определенной длиной, потому что Ваш 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
1
ответ дан 29 September 2019 в 11:25

Ключ к этому вопросу wc поведение относительно файла, данного как аргумент для чтения его содержания, и относительно stdin поток.

Когда wc имеет файл как аргумент, он распечатает тот аргумент наряду с количеством

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

Вы могли всегда обрезать вывод wc FILENAME с инструментами как AWK, сокращение или grep, но это не необходимо. Разговор о AWK , можно было сделать что-то вроде этого с ним:

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

Но типичный сценарий оболочки будет похож на это:

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

Между прочим, нет никакой потребности в проверке, если файл существует. Ваша оболочка или 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
1
ответ дан 29 September 2019 в 11:25

Другие вопросы по тегам:

Похожие вопросы: