linux显示文本
‘壹’ linux 怎么把文字输出到屏幕上
如果文字在文件中,直接使用more、less、pg、head、tail、cat 、tac等命令直接会将文件中的文本输出到屏幕上。
‘贰’ 如何改造 Linux 虚拟终端显示文字
必须使用 UTF-8 模式 ( 默认 vc->utf=1 即可 )
虚拟控制台的 vc_screenbuf 必须修改以为 glyph 提供至少 16bit 的空间。
图形控制台需要 vc_font包含更多的字符,不只是 255 个,并提供代码绘制双倍宽度的中文字形,字体中的字符按照 UNICODE
排列,这样 glyph 就是字符的 UNICODE 编码。
修改虚拟控制台
一开始,我的打算是 vc_screenbuf 修改为 unsigned long long* 类型,32bit 给字符属性,分别表示 16bit
终端前景色和背景色。glyph 则拥有 31bit 的空间 , 因为汉字的宽度为双倍的英文字母 ,其中 1 bit 用来表示双字符宽度。比如 '我' 会表达为
两个 '我',第二个'我'的最高位为 1:绘制任何字形的时候,只绘制字形的左半部分;如果发现最高位为 1
则绘制字体位图中的右半部分。这样同样的绘制代码可以适应英文字母和汉字。写入 vc_screenbuf 的时候,
如果是双倍宽度的字符,需要同时写入两份,第二份的最高位置 1 就可以。但是 vc_screenbuf
的格式已经被到处假定为每字符两个字节。如此修改导致牵一发动全身。许多艰涩难懂的代码都依赖 vc_screenbuf 是
每字符两个字节的设定,直接修改定义后,光是编译器能直接检测出来的就有百余个地方需要修改,还有更多的逻辑并不能被编译器检测出来。如此修改的后果就是会出现许多隐晦的错误,非常难于调式。挣扎后,为最终选择了另一条道路
:
为汉字重新分配一块 vc_unicode_screenbuf
vc_unicode_screenbuf 紧挨着 vc_screenbuf , 事实上 vc_screenbuf
在分配空间的时候,多分配了一倍的空间,多分配的空间充作 vc_unicode_screenbuf,因此 struct vc_data 里并没有添加
vc_unicode_screenbuf 成员。 vc_unicode_screenbuf 同样为每字符 2 个字节,并不包含字符属性,所以 2
个字节如数用来保存 glyph。vc_screenbuf 格式未变,所以 vgacon 不需要修改,这就减少了大量的工作量。向 vc_screenbuf
写入字符的时候,同时写入一份到 vc_unicode_screenbuf 。如果是汉字,由于其 glyph 大于 254 , 所以 vc_screenbuf
的那两个字符 ( 汉字双倍宽度 ) 实际写入的是 0xff 和 0xfe ( 故而上文提到是 glyph 大于 254 的字符 ,0xfe 被保留它用了
)。0xff 表示该字符的 glyph 要到 vc_unicode_screenbuf 提取,然后绘制左半部分;0xfe 表示该字符的 glyph 要到
vc_unicode_screenbuf 提取,然后绘制右半部分。对于 glyph 大于 254 但是又不是双倍宽度的字符,就不需要 0xfe
作陪了。比如屏幕上显示的文字是黑底白字的 “牛 B” , vc_screenbuf 的内容就是 “0x00ff, 0x0ffe, 0x0f42 ” ,
vc_unicode_screenbuf 的内容则是 “牛 , 牛 ,b”
。这是因为一个汉字为两倍的英文字母宽度。在屏幕文字缓冲区上也必须占用两个字符的位置。并且必须有一种机制能知道应该绘制左半部分和右半部分,我使用的就是 0xff
和 0xfe。
修改图形控制台绘制代码
要修改的地方只有 3 个。
struct console_font 添加 charcount 成员。将主线内核的字体设置为 charcount = 255。 主线内核带的字体都是
255 个 glyph 的,所以没有添加字符个数的必要。不过我们即将要添加的字体会有数万字符。
添加一个新的字体,复盖 UNICODE BMP 基本区域的所有符号。
修改字符绘制代码,添加 vc_unicode_screenbuf 的支持。
字符绘制代码的修改比较繁琐,代码分布在 drivers/video/console/ 下的多个文件中。fbcon_putc(s) 由由
vc->vc_sw->con_putc(s) 调用, fbcon_putc(s) 转而调用分散于 drivers/video/console/
的多个 puts 实现。因为终端要支持 console_rotate , decoration , timing , 故而每种模式下的绘制实现都是不同的。我拿
drivers/video/console/bitblt.c 最常用的不倾斜、不加装饰等的终端模式为例来讲解绘图部分的修改。由于中文字体为 16x16
点阵,是对齐的字体,故而其绘制代码为 bit_putcs_aligned() 原先的代码以 glyph 为下标到 vc->vc_font->data
获得字体数据,然后调用 fb_pad_aligned_buffer 执行块拷贝操作。我的修改很简单,原来获得字体数据的代码修改后放入 font_bits()
辅助函数。 在 font_bits 里,要判断 glyph 是否为 0xff 或者 0xfe, 如果不是,使用 glyph 为下标获得字体的左半部分后并返回。
如果是,则从 vc_unicode_screenbuf 获得真正的 glyph 数值,然后再依据现有的 glyph 是 0xff 还是 0xfe
去获得字体的右半部分还是左半部分返回。font_bits 获得字体数据后执行 fb_pad_aligned_buffer 块拷贝。需要修改的地方还有
drivers/video/console/fbcon_ccw.c fbcon_cw.c fbcon_ub.c 。依原理进行修改即可。
虚拟终端的不足之处
虽然费尽心机添加了中文支持,那只是一个 workaround ,
并不能算真正的支持。要真正的支持必须彻底重写虚拟终端和控制台。而要支持中文,就需要更进一步,全面支持 UNICODE ,
包括支持从右向左的书写习惯。在内核里实现一个全面支持 UNICODE
的控制台并不是一件容易的事情,何况内核的政策也不允许将如此庞大的字库装入内核。于是乎,这里出现了死胡同。KMS 和 Wayland
的出现让这死胡同似乎有了个完美的解。
System Compositor?
System Compositor 是一个 wayland compositor,只是运行于系统全局范围。
为了懒人我这里稍微讲解一下 wayland compositor 吧。 Wayland 不同于 X , 在 wayland 的世界里,只有
compositor 和 client。Client 利用各种 API (wayland 给出的示例使用的是 OpenGL ES, 但其实 wayland
并不限制使用的绘图 API 类型 ) 进行窗口绘图,然后将窗口的绘制结果直接提交给 compositor 合成到屏幕上。这样 wayland 本身就不包含绘图
API 而大大简化了 wayland 的设计。Wayland compositor 可以同 X 一样操作显卡向屏幕输出合成后的结果,也可以作为另一个
wayland compositor 的 client。
对于多账户同时登录的实现,固然可以让每一个本地 GUI 会话开启一个 wayland compositor,但是存在更好的办法就是固定开启一个
system compositor。而让所有用户会话的 wayland compositor 再作为 system compositor 的 client.
借由 system compositor 的合成效果,进行快速用户切换也可以进行一些视觉效果。而且 Xorg 本身也已经支持作为 wayland client
运行,这样可以使用传统的 X 提供桌面,而让 wayland system compositor 实现终端切换。这还有一个好处,只有 wayland
system compositor 是以 root 运行的,而用户会话的 compositor 或 X 就不必以 root 权限运行。因为 Wayland
非常轻量,所以 system compositor 可以作为系统级服务常驻内存运行。而因为有了 system compositor ,
内核也不再需要实现虚拟终端了:只需要实现终端模拟器作为 system compositor 的 client
。由于是在用户空间实现的,所有可以加入 UNICODE,矢量字体,国际化的书写习惯等等的支持,再也不用受限于内核啦。 Wayland
还是一个非常年轻的项目,Wayland system compositor 目前还只是设想中的概念,需要更多的人关注参与。笔者相信不久的将来 wayland
‘叁’ linux查看较长或较短的纯文本文件使用哪些命令
在命令行里显示文本文件内容:
cat:在命令行里显示文本文件内容,可以滚屏的(但是不方便把内容输出到其他文件,所以一般脚本内部都用cat,less可以在调用脚本的时候用)。
less:在命令行里编辑文本文件。
vi:在图形界面打开文本文件。
gedit,kate等等:在图形界面打开任意文件或者url(gnome)。
命令作用
grep、fgrep和egrep命令这组命令以指定模式搜索文件,并通知用户在什么文件中搜索到与指定的模式匹配的字符串,并打印出所有包含该字符串的文本行,在该文本行的最前面是该行所在的文件名。grep命令一次只能搜索一个指定的模式;egrep命令检索扩展的正则表达式(包括表达式组和可选项);fgrep命令检索固定字符串,它不识别正则表达式,是快速搜索命令。
‘肆’ Linux文本操作常用命令
在Linux系统里常用于文本查看、操作、统计的命令:
通过多敲键盘,形成手感 肌肉记忆 ,熟练掌握这些命令,在以后生信分析中游刃有余。以下是每个命令的详细的介绍(主要是跟着 生信技能树小郭老师 学习做的笔记)
接下来通过示例把10个命令的常用参数和用法展示出来:
参数的用法介绍:
注意事项:
用 cat 命令可以 查看文本 ,也可以 编辑文本 ,编辑文本要加 > 符号,退出时,另起一行,按 control C 退出
zcat可以查看压缩的文本文件,tac逆向查看
结合 管道符| 使用
head / tail -n :查看文件的前 / 后 n 行,默认 10 行 (在R语言里head和tail默认是前6行)。
less命令用得最多 ,more命令用得比较少
3.1 less命令
less [参数] 文件名
less命令重要的补充用法1 :
需要注意 退出 :只要使用less命令, 按q键
less命令重要的补充用法2 :
参数用法:
less命令 不加参数 查看文件:
less命令加 -N参数 查看文件:显示行号
less命令加 -S参数 查看文件:单行显示,非常规整
对比:less和cat命令显示文本行号的用法:less -N,cat -n
3.2 more命令
**more ** 逐页查看,按空格翻页,按回车换行 ,more命令一般很少用,熟练掌握less命令就好
查看压缩文件
wc 统计字符是也把换行符统计进去,但是别的命令不一定会把换行符算进去,。
常见参数:
切记:用less命令,按q退出
cut命令是按关键词来切的
常见参数:
排列前:
排列后:
解释:1和0比,1大;7和0比,7大…在sort字典排序里,100816比1737小,所以100816排在前面。
命令行查看一个表格结构时,因为制表符对齐的原因,出现一个错位的现象。还有 字典排序 可能和我们平时的认知不一样,所以 加上-n参数 , 让数值有数学意义上的大小来排序 。
uniq命令去重,只有两行出现重复,而且是相邻的两行,如果不相邻,即使出现两行一模一样,不会去重。
uniq命令通常和sort命令搭配使用
换其它文件试试
总之,uniq命令使用时经常和sort一起
常见参数:
常见用法1:
paste file1 file2
-s :按行合并 演示
常见用法2 : paste - -
常见参数:
要养成一个好习惯,原始数据不要轻易修改,修改的东西另外保存,文本保存用> (重定向)或是 >>(追加)
1. 用 less 查看 example.gtf ,然后管道符传递给 wc
2. 截取 example.gtf 第 9 列的内容
3. 在第2步的基础上截取分号分割的第1列
4. 在第3步的基础上排序、去重复并统计
5. 在第4步的基础上,将空格替换成制表符
补充小知识 :
清屏 :control L
查看历史(输入过的)命令 :history
‘伍’ 如何在Linux中more命令查看文本文档
1.命令格式:
more [-dlfpcsu ] [-num ] [+/ pattern] [+ linenum] [file ... ]
2.命令功能:
more命令和cat的功能一样都是查看文件里的内容,但有所不同的是more可以按页来查看文件的内容,还支持直接跳转行等功能。
3.命令参数:
+n 从笫n行开始显示
-n 定义屏幕大小为n行
+/pattern 在每个档案御橡显示前搜寻该字此拆誉串(pattern),然后从该字串前两行之后开始显示
-c 从顶部清屏,然后显示
-d 提示“Press space to continue,’q’ to quit(按空格键继续,按q键退出)”,禁用响铃功能
-l 忽略Ctrl+l(换页)字符
-p 通过清除窗口而不是滚屏来对文件进行换页,与-c选项相似
-s 把连续的多个空行显示为一行
-u 把文件内容中的下画线去掉
4.常用操作命令:
Enter 向下n行,需要定义。森段默认为1行
Ctrl+F 向下滚动一屏
空格键 向下滚动一屏
Ctrl+B 返回上一屏
= 输出当前行的行号
:f 输出文件名和当前行的行号
V 调用vi编辑器
!命令 调用Shell,并执行命令
q 退出more
5.命令实例:
实例1:显示文件中从第3行起的内容
命令:
more +3 log2012.log
输出:
[root@localhost test]# cat log2012.log
2012-01
2012-02
2012-03
2012-04-day1
2012-04-day2
2012-04-day3
======[root@localhost test]# more +3 log2012.log
2012-03
2012-04-day1
2012-04-day2
2012-04-day3
======[root@localhost test]#
实例2:从文件中查找第一个出现"day3"字符串的行,并从该处前两行开始显示输出
命令:
more +/day3 log2012.log
输出:
[root@localhost test]# more +/day3 log2012.log
...skipping
2012-04-day1
2012-04-day2
2012-04-day3
2012-05
2012-05-day1
======[root@localhost test]#
‘陆’ linux中显示文件内容用什么命令
1.tac命令用于反向显示文件内容
tac命令的功能为反向显示文件内容,从最后一行开始读取文本并进行反向输出,。命令以一行文本为单位的,每行文本的顺序不会改变的。
2.more命令用分页显示文件内容
more命令会一页一页地显示文件内容。在交互模式下,使用more命令打开文本之后,会进入一个基于vi的交互界面,在这里可以使用部分vi编辑器的功能,还可以切换到vi编辑器。但more的功能还是比较简单的,有一个增强版的命令是less。
3.less命令用分页显示文件内容
less命令是more命令的高级版本。less命令可以分页显示文件内容,但比more的功能更强大。less命令在读取文件内容时,并不是一次性将整个文件加载之后再显示,而是会根据需要来加载文件的内容,打开文件速度快。而且less命令支持上下键向前或向后翻看文件,查看文件内容更加方便。在交互模式下,less命令也是基于more命令和vi命令的,在这里可以使用vi编辑器的部分功能,还可以切换到vi编辑器。
‘柒’ linux常用的文本内容显示命令有哪些
cat:从第一行开始显示文本内容(适用于内容较少的)
tac:从最后一行开始显示,是 cat 的逆顺序
more:一页一页的显示文本内容(适用于内容较多的)
less:与 more 类似,但是比 more 更好的是,它可以往前翻页!
head:只看文本的前面几行
tail:只看文本的后面几行
nl:显示文本内容与行号