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

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

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

1
задан 26 February 2016 в 17:22

2 ответа

В вашем случае я не считаю правильным ограничивать вывод определенной длиной, потому что ваш выход wc может иметь разную длину. Однако вы можете сделать это, используя cut:

Измените последнюю строку вашего скрипта на

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

. Это приведет к выходу только первых 6 символов.

Я считаю, что вам лучше использовать это:

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

Это приведет к удалению содержимого переменной $input (в вашем случае имя файла ) с выхода.

[edit]: Объяснение второй команды:

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
ответ дан 23 May 2018 в 13:15
  • 1
    не могли бы вы подробно объяснить, что именно делает эта вторая команда – arvind 26 February 2016 в 15:02
  • 2
    Вы не должны использовать бесполезные окончательные "g " в вашем последнем предположении. Даже если это было бы маловероятным событием, это сообщило бы фиктивные значения для файла с полностью числовым именем, которое будет соответствовать выводу wc. – jlliagre 26 February 2016 в 16:45
  • 3
    @arvind см. мое редактирование :-) – Wayne_Yux 26 February 2016 в 16:56
  • 4
    @jlliagre вы правы - я сделал небольшое редактирование, чтобы позаботиться об этом – Wayne_Yux 26 February 2016 в 16:56

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

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

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

Вы всегда можете обрезать вывод wc FILENAME с помощью таких инструментов, как AWK , cut или 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
ответ дан 23 May 2018 в 13:15

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

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