打印输出 echo、tee、cat

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了打印输出 echo、tee、cat相关的知识,希望对你有一定的参考价值。

参考技术A 打印一个字符串,或变量,或另一命令执行的返回,预设打印后自动换一行

-e 启用转义,字符串中 \n 表示追加换行, \c 表示本次不换行
-n 相当于 -e "string..\c" ,输出结束后不换行

读取标准输入,并输出到指定文件,可指定多个备份

-a / --append 追加模式,本次新增内容追加到文件后面

打印输出多个文件内容,不指定 file 或指定为 - 时则从标准输入中读取。
可读取 socket 文件流,保持开启直到读取到 EOF 标记。

-n 输出行号
-b 输出行号,但不包括空行
-s 合并多个空行为一行
-e 输出非打印字符,行尾附加 $ 作为结束符
-t 输出非打印字符,tab转换为 ^I 表示
-v 输出非打印字符,控制符显示为 ^X ,删除符为 ^? ,非标准ASCII字符显示为 M- +低七位对应的ASCII字符

文本编辑与打印命令

打印命令:echo,printf,read,tee

文本编辑器:vim,nano,gedit

重命名:rename,dirname,basename,alias

历史命令:history

5.1.echo

功能:打印一行

语法:

echo [SHORT-OPTION]... [STRING]...

echo LONG-OPTION

常用选项:

-n:不输出换行符

-e:解释转义字符

-E:不解释

示例:

[[email protected] ~]# echo -e ‘1\n2\n3‘  #加了-e,就把\n定义为换行字符,这样才会换行打印
1
2
3
[[email protected] ~]# echo ‘1\n2\n3‘ #不加就只是作为字符输出了
1\n2\n3
[[email protected] ~]# echo -e ‘1\t2\t3‘ #解释制表符
1	2	3
[[email protected] ~]# echo ‘1\t2\t3‘
1\t2\t3
[[email protected] ~]# echo hello,world > 1 #echo的重定向功能
[[email protected] ~]# cat 1
hello,world
[[email protected] ~]# echo welcome to linux world >> 1 #echo的追加功能
[[email protected] ~]# cat 1
hello,world
welcome to linux world

5.2.printf

功能:格式化打印数据,默认打印字符串不换行

语法:printf FORMAT [ARGUMENT]...

          printf OPTION

常用选项:

format:

%.ns    输出字符串,n是输出几个字符

%ni      输出整数,n是输出几个数字

%m.nf  输出浮点数,m是输出的整数位数,n是输出的小数位数

%x       不带正负号的十六进制值,使用a至f表示10至15

%X      不带正负号的十六进制,使用A至F表示10至15

%%      输出单个%

%d       有符号32位整数

%lld     有符号64位整数

%llx      有符号64位16进制整数

%u        无符号32位整数


常用空白符:

\n:换行

\r:回车

\t:水平制表符


对齐方式:

%-5s   对参数每个字段左对齐,宽度为5

%-4.2f  左对齐,宽度为4,保留两位小数

不加横线"-"表示右对齐


示例:

#打印一个字符:
[[email protected] test]# printf "%.1s" 123
#打印三个字符:
1[[email protected] test]# printf "%.3s" 123
#不保留小数,前面什么都不加
123[[email protected] test]# printf "%.f" 1.314529
#保留两位
1[[email protected] test]# printf "%.2f" 1.314529
#换行打印,看到前面的为啥没有结果,因为都跑到第二行开头来了
1.31[[email protected] test]# printf "%.2f\n" 1.314529
1.31
#格式化打印:
[[email protected] test]# printf "user: %s\tpassword: %d\n" root 123
user: rootpassword: 123
#左对齐宽度5
[[email protected] test]# printf "%-5s  %-5s %-5s\n" 1 2 3
1      2     3    
#右对齐宽度5
[[email protected] test]# printf "%5s  %5s %5s\n" 1 2 3
    1      2     3
#每行右对齐
[[email protected] test]# printf "%5s\n" 1 2 3
    1
    2
    3
#每行左对齐
[[email protected] test]# printf "%-5s\n" 1 2 3
1    
2    
3

5.3.read

功能:接收标准输入,或其他文件描述符的输入

常用选项:

-d:输入结束符,默认结束符是换行

-p:提示语句

-n:字符个数

-t:等待时间

-s:不回显

-a:数组名

示例:

[[email protected] scripts]# cat read01.sh 
#!/bin/bash
echo -n "enter your name:" #参数-n不换行,默认是换行的
read name   read  #读入变量,后边的echo才能引用变量
echo "hello $name" 
执行结果:
[[email protected] scripts]# sh read01.sh 
enter your name:yyl
hello yyl
[[email protected] scripts]# sh read01.sh #没有read的读入,变量name不起作用,结果就是底下这样
enter your name:hello 
[[email protected] scripts]# cat read01.sh 
#!/bin/bash
echo -n "enter your name:"
echo "hello $name"
-p参数使用
[[email protected] scripts]# sh read01.sh 
enter your name:yyl
hello yyl
[[email protected] scripts]# cat read01.sh 
#!/bin/bash
read -p "enter your name:" name
echo "hello $name"
是不是比echo的效果好很多
-t参数使用
[[email protected] scripts]# sh read02.sh 
enter your name:yyl
hello yyl
[[email protected] scripts]# sh read02.sh  计时到时,会自动退出脚本
enter your name:sorry,timeout
[[email protected] scripts]# cat read02.sh 
#!/bin/bash
if read -t 10 -p "enter your name:" name;then
   echo "hello $name"
else
   echo "sorry,timeout"
fi
-n参数使用
[[email protected] scripts]# sh read03.sh 
enter your name:yyl
hello yyl
[[email protected] scripts]# sh read03.sh 
enter your name:dfd
Usage:YYL|yyl PXT|pxt
[[email protected] scripts]# sh read03.sh 
enter your name:pxt
fine,pxt
[[email protected] scripts]# cat read03.sh 
#!/bin/bash
read -n3 -p "enter your name:" name
case $name in
YYL|yyl)
   echo -e "\nhello $name"
;;
PXT|pxt)
   echo -e "\nfine,$name"
;;
*)
   echo -e "\nUsage:YYL|yyl PXT|pxt"
;;
esac
说明:使用-n后,后接3,表示read接到3个字符就对出,只要有字符输入,read就会接受输入传给变量,无需按回车
-s选项使用
[[email protected] scripts]# sh read01.sh 
enter your name:hello yyl
[[email protected] scripts]# cat read01.sh 
#!/bin/bash
read -s -p "enter your name:" name
echo "hello $name"
说明:-s会隐藏你输入的信息,起到一个安全保护的作用
运用read读取文件
[[email protected] scripts]# sh read04.sh 
LINE 1:root:x:0:0:root:/root:/bin/bash
................................
LINE 22:yyl:x:500:500::/home/yyl:/bin/bash
print ok
[[email protected] scripts]# sh read05.sh
LINE :root:x:0:0:root:/root:/bin/bash
................................
LINE :yyl:x:500:500::/home/yyl:/bin/bash
print ok
[[email protected] scripts]# cat read04.sh  read05.sh 
#!/bin/bash
count=1 #加入count是为了加入行号
cat /etc/passwd |while read line;do #把cat查看的文件作为read的读入,一行行读取
   echo "LINE $count:$line"
   count=$[ $count + 1 ]    #每循环count加1
 done
echo "print ok"
#!/bin/bash   #这个脚本没有加入count,它也会一行行去读取,只是少了行号
cat /etc/passwd |while read line;do
   echo "LINE $count:$line"
done
echo "print ok"

5.4.tee

功能:从标准输入读取,写到标准输出和文件

语法:tee [OPTION]... [FILE]...

常用选项:

-a 追加到文件

示例:

[[email protected] ~]# echo 123 |tee -a 123
123
[[email protected] ~]# cat 123
123
说明:不过这样不觉得这个命令增加工作量,输入追加echo命令就可以做到

5.5.history

功能:打印或操作历史命令列表

常用选项:

-c:清空命令历史

-d n:删除指定历史命令,n表示命令行号

#:显示最近的#条历史命令

-a:追加本次会话新执行的历史命令列表到历史文件中

-n:读取历史命令文件中未读过的行到历史列表,这里的历史命令文件指的是存储历史命令的文件,历史列表是执行history的列表

-r:读取历史文件中的命令到当前历史列表,也就是history

-w:保存历史列表到历史命令文件中

history相关的环境变量:

HISTFILE          指定存放历史文件位置,默认位置在~/.bash_profile,/etc/profile(针对全局 )
HISTFILESIZE      命令历史文件记录历史的条数 
HISTSIZE          命令历史记录的条数,默认为1000 
HISTTIMEFORMAT="%F %T"  显示命令发生的时间 
HISTIGNORE="str1:str2:..." 忽略string1,string2历史 
HISTCONTROL      包含一下4项,让哪一项生效只需要让其=下面一项即可 
ignoredups:  忽略重复的命令;连续且相同方为“重复” 
ignorespace:  忽略所有以空白开头的命令 
ignoreboth:ignoredups,ignorespace 
erasedups:    删除重复命令

 history常用的快捷键
 重新调用前一个命令中最后一个参数:
  !$ 
  Esc, .(点击Esc键后松开,然后点击. 键)
!!:调用上一条命令

示例:

[[email protected] ~]# history |wc -l
1000
[[email protected] ~]# history -c   #-c是清空历史列表而非历史文件中的命令
[[email protected] ~]# history |wc -l
1
[[email protected] ~]# history -r  #-r加了历史文件中的命令,又有1000条命令
[[email protected] ~]# history |wc -l
1000
[[email protected] ~]# history
.......................
 2136  mv /home/yyl01/file{1..5} /home/yyl01/redhat/test/
 2137  cd /home/yyl01/redhat/test/
 2138  ls
 2139  mv file{1..5} test1 test2 test3 test4 test5
 2140  ls 
 2141  ls *|sed -i ‘s/file/test/g‘
 2142  ls *
 2143  echo *
 2144  echo * |sed -i ‘s/file/test/g‘
 2145  history |wc-l
 2146  history |wc -l
 2147  history
[[email protected] ~]# history -d 2139 
[[email protected] ~]# history
.........
 2137  cd /home/yyl01/redhat/test/
 2138  ls
 2139  ls 
 2140  ls *|sed -i ‘s/file/test/g‘
 2141  ls *
 2142  echo *
 2143  echo * |sed -i ‘s/file/test/g‘
 2144  history |wc-l
 2145  history |wc -l
 2146  history
 2147  history -d 2139
 2148  history
[[email protected] ~]# history -n  跟-r命令效果差不多,只是以未读到历史列表中的会读到,而不是像-r所有
[[email protected] ~]# cat .bash_history |wc -l  #说明只能存1000个命令
1000
[[email protected] ~]# history -w #-w存入也是覆盖掉以前的,继续是1000个命令

5.6.alias

功能:定义别名

常用选项:

-p:打印现有的所有别名(唯一参数)

示例:

#alias kk=ls  只在当前终端生效
#unalias kk  取消别名
#vim /root/.bashrc    
永久定义别名,局部配置文件(针对root)
#alias kk=‘ls -l‘
#source ~/.bashrc  或者. ~/.bashrc  
立刻马上生效
#vim /etc/bashrc   
让所有的用户都生效(全局)

5.7.rename

功能:重命名文件,支持通配符

语法:rename from to file...

          rename -V

常用选项:

-V:打印版本(唯一参数)

示例:

[[email protected] scripts]# rename -V
rename (util-linux-ng 2.17.2)
批量命名文件
将file1-file5重名为test1-test5
[[email protected] ~]# ls file*
file1  file2  file3  file4  file5
[[email protected] ~]# rename "file" "test" *
[[email protected] ~]# ls test*
test1  test2  test3  test4  test5
创建文件后缀为.jpg的,然后把后缀改名为.html
[[email protected] test]# for file in `seq -w 10`;do touch stu_$file.jpg;done
[[email protected] test]# ls
stu_01.jpg  stu_03.jpg  stu_05.jpg  stu_07.jpg  stu_09.jpg
stu_02.jpg  stu_04.jpg  stu_06.jpg  stu_08.jpg  stu_10.jpg
[[email protected] test]# rename ".jpg" ".html" ./*
[[email protected] test]# ls
stu_01.html  stu_03.html  stu_05.html  stu_07.html  stu_09.html
stu_02.html  stu_04.html  stu_06.html  stu_08.html  stu_10.html

5.8.dirname

功能:去除路径的最后一个后缀

语法:dirname NAME

          dirname OPTION

man手册的示例:

dirname /usr/bin/sort

              Output "/usr/bin"

dirname stdio.h

              Output "."

验证下:

[[email protected] test]# dirname /usr/local/bin/
/usr/local
[[email protected] scripts]# ls read01.sh 
read01.sh
[[email protected] scripts]# dirname read01.sh 
.

5.9.basename

功能:打印路径的最后一个后缀

语法:basename NAME [SUFFIX]

          basename OPTION

常用选项:

-V:查看版本

man手册示例:

basename /usr/bin/sort

              Output "sort".


       basename include/stdio.h .h

              Output "stdio".

跟dirname刚好相反

验证下:

[[email protected] scripts]# basename /usr/local/bin
bin
[[email protected] scripts]# ls read01.sh
read01.sh
[[email protected] scripts]# basename read01.sh 
read01.sh

5.10.nano

功能:简单文件编辑器

下面介绍下用法,具体功能自己体会,我本人喜欢用vim

用法:

光标控制

移动光标:使用用方向键移动。

选择文字:按住鼠标左键拖到。

 

复制、剪贴和粘贴

复制一整行:Alt+6

剪贴一整行:Ctrl+K

粘贴:Ctrl+U

选定复制:先ctrl+6或alt+a标记开始,然后光标移至要复制或剪切的末尾,alt+6复制,ctrl+k剪贴,若要取消,再按一次ctrl+6

搜索:Ctrl+W

翻页:

Ctrl+Y到上一页

Ctrl+V到下一页

保存:

Ctrl+O

退出:

Ctrl+X


5.11.gedit

功能:文本编辑器

了解即可,文本编辑还是vim强大

快捷键:

  CTRL-Z:撤销

  CTRL-C:复制

  CTRL-V:粘贴

  CTRL-T:缩进

  CTRL-Q:退出

  CTRL-S:保存

  CTRL—R:替换

  CTRL+Tab 切换

  CTRL+W 关闭选项卡


5.12.vim

vi和vim:文本编辑器(增强版vi,现在基本各种linux版本都带有vim)
1、vi编辑器是所有类unix下的标准编辑器。
2、vim是vi的升级版本,大部分类unix系统都默认安装了vim编辑器
3、vim具有程序编辑能力,可以通过颜色来辨别语法的正确性,方便程序设计

vim工具三种模式:
1,一般普通模式:底行模式(末行模式)
2,编辑模式(插入模式):i I o O a A r R
3,命令行模式:   : /  ?

移动相关:
--ctrl+b   向上翻页   =  page up
--ctrl+f    向下翻页=  page down
--ctrl+d   向下移动半页
--ctrl+u   向上移动半页
--G          移动到页末 =shift +g
--gg        移动到页头
--0          移动到行头 = home
--$          移动到行末 = end
--n          (代表数字)+回车   向下移动N行   
--h          向左移动
--l           向右移动
--k          向上移动
--j           向下移动

删除,复制,粘贴
--x           向后删除一个字符 = delete
--X          往前删除一个字符 = backspace
--dd        直接删除光标所在行ndd  (n代表数字,删除n行)
--yy        复制光标所在行nyy(n代表数字,复制n行)
--p         粘贴
--u         回退上一次操作     按一次u只能回退一次,一直按u,撤销到文件最后一次保存的状态 |ctrl+r 撤销撤销
--ctrl+r  重做上一次操作

进入编辑模式:
i       当前insert
I       行头insert
a      向后一个字符insert
A     行末insert
o     下一行insert
O    上一行insert
r      替换光标所在的字符
R     从光标处向后一直替换
ESC 从编辑模式回退到一般模式


查找与替换:
-- /word                          查找单词      n  向下查找   N 向上查找
-- :1,$s/old/new/g       从第一行到最后一行都用new替换old
--:%s/root/hello             替换每一行第一次出现的关键字
--:%s/root/uplook/g      全文搜索替换
--:%s/root/uplook/gc    交互式搜索替换
--:11s/nologin/haha/g   在指定行搜索替换
-- :%s/old/new/g           从第一行到最后一行都用new替换old
-- :n1,n2s/old/new/g     从n1行到n2行用new替换old
-- :1,$s/old/new/gc从 第一行到最后一行都用new替换old,多加了一个c就可以要求用户确认哪些换哪些不换
--/关键字                       n向下匹配|N向上匹配
--?关键字                     n向上匹配|N向下匹配


如果搜索的关键字里有特殊字符:
自定义分割符:
--:%s#/sbin/nologin#hello#g
反斜杠进行转义:
--:%s/\/bin\/bash/\/sbin\/nologin/g
--:w /tmp/aaa.txt       文件另存为
--:1,5w 888.txt           保存文件的前5行
--:r filename              读取另一个文件的内容到当前文件(默认光标所在行的下面)
--:set nu                    显示行号(临时)
--:n(代表数字)+回车直接把光标定位到n行
--:w保存 (write)
--:q退出(quit)
--:wq保存并退出    =shift+zz   
--+!表示强制保存或者退出


如果你希望vim打开时默认就有行号,可以这样做
# vim /etc/vimrc 
--set number --在这个配置文件空的地方加上这一句就可以了
--:set number    或者 : set nu   把每一行都加上行号
--:set nonumber  或者 : set nonu去掉每一行前的行号

总结:
vim file——>命令行模式(yy/p/P/u/dd/G/gg..)——>编辑模式(i/I/a/A/o/O/r/R)——>底行模式(按“Esc”——>退出到命令行模式——>再按冒号“:”|搜索替换等)


5.13.练习
5.13.1 将/etc/passwd文件拷贝到/tmp目录下面。在/tmp/passwd文件的第15行下添加“hello yyl”,并复制其下5行,粘贴在文件的最下面,保存。然后全文搜索将“/bin/bash”替换成yyl,并保存后面20行到 /tmp/passwd.bak文件中,退出编辑。

解答:

cp /etc/passwd /tmp
:15 按o到下行添加“hello yyl”
按esc光标移动下行
5yy shift+g end  p
:%s/\/bin\/bash/yyl/g
:set nu
:11,30w /tpm/passwd.bak

5.13.2.找出/etc/下面的所有目录并将其重定向到/tmp/etcdir文件里

解答:

方法一:
[[email protected] tmp]# ll /etc/ >> /tmp/123
[[email protected] tmp]# cat /tmp/123 |grep ^d >> /tmp/etcdir
方法二:
[email protected] tmp]# ll /etc/ |grep ^d >> /tmp/etcdir
方法三:ls
#!/bin/bash
ls -l /etc/* | grep "^d" >> /tmp/ccc.txt
if [ $? -eq 0 ];then
      echo "file is create successed"
else
      echo "file is create failed"
fi
方法四:(用while+read循环)
[[email protected] scripts]# cat Dir.sh 
#!/bin/bash
ls -l /etc/|grep ^d |while read line;do
    echo $line >>/tmp/etcdir
done
cat /tmp/etcdir |wc -l

5.13.3.在/tmp/etcdir文件中追加“好好学习,天天向上”,然后把/etc/passwd文件的内容添加到/tmp/etcdir文件里,并重命名为newetcdir

[[email protected] scripts]# echo "好好学习,天天向上" >> /tmp/etcdir
[[email protected] scripts]# cat /etc/passwd >> /tmp/etcdir 
[[email protected] scripts]#mv /tmp/etcdir /tmp/newetcdir
另外一种方法:
[[email protected] scripts]# rename "etcdir" "newetcdir" /tmp/etcdir

5.13.4.小实验
一个终端 tail -f /var/log/messages
另一个终端logger -t "任何信息" " 任何信息"  (logger命令后边说)
再观察第一个终端的变化

[[email protected] ~]# tail -f /var/log/messages
May 26 11:11:24 localhost 任何信息:  任何信息
May 26 11:11:35 localhost 任何信息:  任何信息
[[email protected] ~]# logger -t "任何信息" " 任何信息"

本文出自 “烂笔头” 博客,请务必保留此出处http://lanbitou.blog.51cto.com/9921494/1929713

以上是关于打印输出 echo、tee、cat的主要内容,如果未能解决你的问题,请参考以下文章

tee(打印并保存文件)

Linux命令之保存命令结果到文件并且输出到屏幕tee

linux 终端打印内容输出到文件

屏幕打印工具tee

tee命令

当使用 cat 找不到参数时,Bash 打印帮助消息