重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
printf终端打印
我们提供的服务有:成都网站设计、成都网站建设、外贸网站建设、微信公众号开发、网站优化、网站认证、桦南ssl等。为超过千家企事业单位解决了网站和推广的问题。提供周到的售前咨询和贴心的售后服务,是有科学管理、有技术的桦南网站制作公司
printf使用的参数和C语言中的printf函数一样,使用引用文本或由空格分隔的参数。在printf函数中,我们可以使用格式化字符串,指定字符串的宽度、左右对齐方式等。在默认情况下,printf不会在行尾添加换行符,需要手动添加。
复制代码代码如下:
printf "Hello world" #使用引用字符
printf "%-5s %-10s %-4s\n" No Name Mark #指定宽度及左对齐方式
printf "%-5s %-10s %-4s\n" 1 Sarath 80.3456
----仅供参考
sed = 文件名 | sed 'N;s/\n/:/' | sed -n '/显示行包含的关键字/p',例子:
假设我有文件test,内容为:
Baidu123
ppppqqqq
bAidu567
a.此时我想把含有baidu的行以 "行号:该行完整内容"的形式输出,则只需要执行:
sed = test | sed 'N;s/\n/:/' | sed -n '/baidu/Ip' //最后p前面的是大写的I
得到结果为:
1:Baidu123
3:bAidu567
*.忽略大小写,还有一个比较笨的方法,使用[],将关键字的所有字母的大小写都包括了,就来例来说,/[bB][aA][iI][dD][uU]/
b.输出所有的行,不使用关键字过滤行,则只需要去掉最后一部分,即:
sed = test | sed 'N;s/\n/:/'
得到结果为:
1: Baidu123
2:ppppqqqq
3bAidu567
完!
---------------------------------------------
grep解决这个问题比较好吧,假设有文件test,内容为:
Baidu123
ppppqqqq
bAidu567
如果我想得到格式如 line: line_content这种格式内容的话:
grep -ni "baidu" test
结果为:
1:Baidu123
3:bAidu567
最简单的你 a.out 1.txt
或者用dup2,重定向。
你首先要搞清楚控制台上的输出是怎么输出的,比如说是程序里面printf出来的, 脚本里面echo出来的等等。
然后做一个写日志的函数代码那个输出。也可以把标准输出的文件描述符dup到你要写的文件上面。
最简单的你 a.out 1.txt
或者用dup2,重定向。
函数执行,产生的标准输出,已经再控制台了,我再把它重定向。
你首先要搞清楚控制台上的输出是怎么输出的,比如说是程序里面printf出来的, 脚本里面echo出来的等等。
然后做一个写日志的函数代码那个输出。也可以把标准输出的文件描述符dup到你要写的文件上面。
execvp(args[0], args) 这个函数运行产生的结果。
使用命令重定向操作符可以使用重定向操作符将命令输入和输出数据流从默认位置重定
向到不同的位置。输入或输出数据流的位置即为句柄。
下表将列出可用的句柄。
句柄 句柄的数字代号 描述
STDIN 0 键盘输入
STDOUT 1 输出到命令提示符窗口
STDERR 2 错误输出到命令提示符窗口
UNDEFINED 3-9 这些句柄由应用程序单独定义,并且是各个工具特定的。
数字 0 到 9 代表前 10 个句柄。可以使用命令 Cmd.exe 运行程序并将该程序前 10 个
句柄中的任何一个重定向。要指定想使用的句柄,可在重定向操作符前面键入该句柄的
数字。如果未定义句柄,则默认的 重定向输入操作符是 0,而默认的 重定向输出
操作符是 1。键入 或 操作符之后,必须指定要读取或写入数据的位置。可以指定
文件名或另一个现有的句柄。
要指定重定向到现有句柄,请使用与 () 字符,后面接要重定向的句柄号
(例如 句柄#)。例如,下面的命令可以将句柄 2(即 STDERR)重定向到
句柄 1(即 STDOUT):
21
下表列出了可用于将输入和输出数据流进行重定向的操作符。
重定向操作符 描述
将命令输出写入到文件或设备(例如打印机)中,而不是写在命令提示符窗口或句柄中。
从文件中而不是从键盘或句柄中读入命令输入。
将命令输出添加到文件末尾而不删除文件中的信息。
将一个句柄的输出写入到另一个句柄的输入中。
从一个句柄读取输入并将其写入到另一个句柄输出中。
| 从一个命令中读取输出并将其写入另一个命令的输入中。也称作管道。
默认情况下,可以从键盘将命令输入(即 STDIN 句柄)发送到 Cmd.exe,然后由
Cmd.exe 将命令输出(即 STDOUT 句柄)发送到命令提示符窗口。
重定向输入 ()
要将键盘输入重定向到文件或设备,请使用 操作符。例如,要从 File.txt 获取
sort 命令的输入,请键入:
sortfile.txt
File.txt 的内容将以字母顺序列表的方式显示在命令提示符窗口中。
操作符可以打开具有只读访问的指定文件名。所以,不能使用该操作符向文件中写入
信息。例如,如果以 2 启动程序,则所有试图读取句柄 0 的操作都将失败,因为句
柄 2 最初是以只写访问打开的。
注意
0 是 重定向输入操作符的默认句柄。
重定向输出 ()
几乎所有的命令都将输出发送到命令提示符窗口。即使将输出发送到驱动器或打印机的
命令也会在命令提示符窗口显示消息和提示。
要将输出从命令提示符窗口重定向到文件或设备,请使用 操作符。可以在许多命令中
使用该操作符。例如,要将 dir 输出重定向到 Dirlist.txt,请键入:
dirdirlist.txt
如果 Dirlist.txt 不存在,Cmd.exe 将创建该文件。如果 Dirlist.txt 存在,Cmd.exe
将使用 dir 命令的输出替换文件中的信息。
要运行 netsh routing dump 命令,然后将输出发送到 Route.cfg,请键入:
netsh routing dumpc:\route.cfg
操作符可以打开具有只写访问属性的指定文件。所以,不能使用该操作符读取文件。
例如,如果使用重定向 0 启动程序,则所有试图写入句柄 1 的操作都将失败,因为
句柄 0 最初是以只读访问打开的。
注意
1 是 重定向输出操作符的默认句柄。
复制句柄
重定向操作符 可以将输出或输入从一个指定句柄复制到另一个指定的句柄。例如,
要将 dir 输出发送到 File.txt 并将错误输出发送到 File.txt,请键入:
dirc:\file.txt 21
复制句柄时,可以复制该句柄原状态的所有特性。例如,如果一个句柄具有只写访问的
属性,则该句柄的所有副本都具有只写访问属性。不能将一个具有只读访问属性的句柄
复制到另一个具有只写访问属性的句柄。
使用 操作符重定向输入和副本
要将重定向输入操作符 () 与复制操作符 () 一起使用,指定的文件必须已经存在。
如果输入文件存在,Cmd.exe 将以只读方式打开该文件,然后将文件中包含的字符作为
输入发送到此命令(如同从键盘输入一样)。如果指定了句柄,Cmd.exe 将指定的句柄
复制到系统现有的句柄中。
例如,要以句柄 0 输入读取(即 STDIN)的方式打开 File.txt,请键入:
file.txt
要打开 File.txt,并在内容排序后将输出发送到命令提示符窗口(即 STDOUT),请键入:
sortfile.txt
要查找 File.txt,然后将句柄 1(即 STDOUT)和句柄 2(即 STDERR)重定向到
Search.txt,请键入:
findfile file.txtsearch.txt 21
要以句柄 0 输入读取(即 STDIN)的方式复制用户定义句柄 3,请键入:
3
使用 操作符重定向输出和复制
如果将输出重定向到文件且指定了现有的文件名,Cmd.exe 将以只写方式打开文件并覆
盖该文件内容。如果指定了句柄,Cmd.exe 将文件复制到现有句柄中。
要将用户定义句柄 3 复制到句柄 1,请键入:
3
要将包括句柄 2(即 STDERR)的所有输出从 ipconfig 命令重定向到
句柄 1(即 STDOUT),然后将输出重定向到 Output.log,请键入:
ipconfig.exeoutput.log 21
使用 重定向操作符追加输出
要从命令中将输出添加到文件末尾而不丢失文件中已存在的任何信息,请使用两个连续
的大于号(即 )。例如,下面的命令可以将由 dir 命令生成的目录列表追加到
Dirlist.txt 文件:
dirdirlist.txt
要将 netstat 命令的输出追加到 Tcpinfo.txt 的末尾,请键入:
netstattcpinfo.txt
使用管道操作符 (|)
管道操作符 (|) 可以提取一个命令的输出(默认情况下是 STDOUT),然后将其导入另
一个命令的输入中(默认情况下是 STDIN)。例如,下面的命令将对目录分类:
dir | sort
在本例中,将同时启动两个命令,但随后 sort 命令会暂停,直到它接收到 dir 命令
的输出为止。sort 命令使用 dir 命令的输出作为输入,然后将输出发送到
句柄 1(即 STDOUT)。
合并带重定向操作符的命令
可以通过合并带有其他命令和文件名的筛选器命令创建自定义命令。例如,可以使用以
下命令存储包含“LOG”字符串的文件名:
dir /b | find "LOG" loglist.txt
dir 命令的输出通过 find 筛选器命令发送。包含字符串 "LOG" 的文件名作为文件名
列表(例如,NetshConfig.log、Logdat.svd 和 Mylog.bat)存储在文件
Loglist.txt 中。
要在相同命令中使用多个筛选器,请使用管道 (|) 分隔筛选器。例如,下面的命令将
搜索 C 盘上的每个目录以查找包含 "LOG" 字符串的文件名,并且在命令提示符窗口中
每次显示一屏:
dir c:\ /s /b | find "LOG" | more
利用管道 (|) 可以将 Cmd.exe 导向为通过 find 筛选器命令发送 dir 命令输出。
find 命令只选择包含字符串 "LOG" 的文件名。more 命令可以显示由 find 命令选择
的文件名(在命令提示符窗口中每次显示一屏)。有关筛选器命令的详细信息,请参阅
使用筛选器。
根据你的意思,可以这样
#includestdio.h
#includestdlib.h
int main(){
system("./`cat /proc/mtd`");
return 0;
}
system() 函数就是调用shell。
`cat /proc/mtd` 就是取得这个命令的执行结果
./`cat /proc/mtd` 就是执行这个结果。
但是 在我的系统中执行cat /proc/mtd ,
cat: /proc/mtd: 没有那个文件或目录
所以没有办法测试,但是这个方法是对的。如果cat /proc/mtd的结果是很多个的话,最好加上cut命令 来作为取舍
tee用于把命令结果打印在屏幕上并同时保存到文件。
tee用法
描述:从标准输入中读取并同时写入到标准输出和指定的文件上
选项:
-a,--append:不覆盖,而是追加输出到指定的文件中
-i,--ignore-interrupts:忽略中断信息
若指定的输出文件为'-',则再次输出到标准输出上
实例:
tee Example.txt #将标准输入中输入的内容同时输出到Example.txt和标准输出上
实践:
例如 ifconfig | tee ifconfig.log
查看iconfig.log
注:
标准输入一般有键盘和其它文件,标准输出有屏幕等。tee只能进行标准输入的输出,对于错误输入是不能输出的。
在调试脚本时,想要每个命令的执行过程都输出到屏幕或者文件中,以便后续查看,如何操作呢?首先脚本第一行要写为“#!/bin/bash -x”,这样会把每个命令的执行记录都输出到屏幕,若还要输出到指定文件,要用到tee,但tee只能进行标准输入,对于标准输入和错误输入要用到下式:
./filename.sh 21 | tee output.log 或者直接 bash -x ./filename.sh 21 | tee output.log
今天调试一个bash,要把屏幕的输出结果存到log文件中,开始输入$bash -x ./test.sh log 结果发现log里只存放了程序的执行结果,后来在cu的一篇帖子里?tid=264380highlight=bash得到了启发,bash -x的调试信息是输出到2号流中的,所以解决方案为bash -x ./test.sh 21 | tee log 想起以前要存放执行make的结果时也遇到类似问题,总结如下:
1、管道符的“I”的作用只是把前一个程序的标准输出流(stdout)的数据作为后一个程序的标准输入流stdin的数据,如不进行重定向,则其他输出流的信息是无法传给后面的程序的
2、屏幕得到的信息不一定是从程序的标准输出来的,也包括标准错误输出流stderr中的信息
3、有些程序(特别是象bash、make这样执行了其他程序的程序)的设计者为了省事,把一些正常情况的信息也放在stderr中输出(即使程序本身并无错误),而stdout用来输出被调用程序的执行时信息,造成了用户的误解简单编写了一下脚本,通过ssh登陆在命令行下运行正常,可是将脚本添加到crontab中就不正常。想记录一下输出信息,分析一下错误原因。将脚本通过使用info.log 重定向输出,结果发现一些在命令行下可以看到的文本信息没有记录到info.log文件中,研究了一下,那些输出估计是输出到了标准错误上。
研究了一下通常添加命令后面几个输出含义
■ /dev/null 输出到空设备,表示丢掉输出信息。
■ 21将输出到标准错误的信息输出到标准输出设备(通常是屏幕)有3个默认的i/o,
■ 0是标准输入,一般是键盘
■ 1是标准输出,一般是屏幕
■ 2是标准错误,有时候屏幕上可以看到,但是重定向的文件中看不到的就是它了
你想删除查找结果的行吧,
那不用两个命令,
可以直接删除匹配关键字的行
sed -n '/关键字/d' filename
也可以在查找之后加上替换命令,替换的字符串为空就可以实现删除
sed -n '/查询字符串/p' filename | sed 's/要删除的字符串/空/g'
关键字,查询字符串和要删除字符串可以用正则表达式。
如果非要用传递的话,写个shell script
#!/bin/sh
MyLine='sed -n '/10.10.10.222 10.10.0.1 : PSK "abcdefgh"/=' filename'
然后把 MyLine 传给下一条命令就行了
sed '/MyLine/d' filename