打印输出 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的主要内容,如果未能解决你的问题,请参考以下文章