整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

「测试开发基础知识-HTML」表格标签,不得不说的重

「测试开发基础知识-HTML」表格标签,不得不说的重点

续一周没怎么更新了,今天我们继续HTML的学习,表格标签。表格是实际开发中常用的一种标签类型,会说到表格标签的主要作用和基本语法。

主要作用: 表格主要用于显示、展示数据,因为它可以让数据展示的非常规整,可读性非常好,特别是后台展示数据的时候,能够熟练运用表格非常重要。一个清爽简约的表格可以把复杂的数据表现的很简单。表格不是用来布局页面的,而是用来展示数据的。

表格的基本语法: <table><tr><td></td></tr></table>

<table></table>用来定义表格标签

<tr></tr>用于定义表格中的行,嵌套在<table>标签中使用

<td></td>用于定义表格中的单元格,嵌套在<tr>标签中使用,字母td指表格数据(table data),即数据单元格的内容。

我们来展示一个例子,比如 数据库中有三个字段,分别为 姓名 性别和年龄,如果想用前端将这三个字段的数据展示出来,应该怎么操作呢?


先看效果:

然后我们看下代码:

<!DOCTYPE html>

<html>

<head>

<meta charset="utf-8">

<title>20210829---</title>

</head>

<body>

<table>

<tr> <td>姓名</td> <td>性别</td> <td>年龄</td> </tr>

</table>

</body>

</html>

这次开始使用vs code来编辑代码了,感觉比sublime line高级一些,但是相对的也麻烦点。可以看到,在前端页面展示了 姓名、性别和年龄。然后我们添加一行数据,看效果:

民族英雄黄飞鸿如果还活着,应该也是一位非常高寿的宗师了。多加几个数据

让我们看看代码有什么不同

<!DOCTYPE html>

<html>

<head>

<meta charset="utf-8">

<title>20210829---</title>

</head>

<body>

<table>

<tr> <td>姓名</td> <td>性别</td> <td>年龄</td> </tr>

<tr> <td>黄飞鸿</td> <td></td> <td>188</td> </tr>

<!--再多创建几个数据-->>

<tr><td>鬼脚七</td> <td></td> <td>186</td> </tr>

<tr><td>梁宽</td> <td></td> <td>33</td> </tr>

</table>

</body>

</html>

可以看到,就是将之前的数据进行了复制而已。


接着我们说下表头单元格标签,一般表头单元格位于表头的第一行或第一列,表头单元格里面的文本内容,加粗居中表示。

<th>标签表示HTML表格的表头部分,table head的缩写

我们先来看下效果:

再看下对应的代码:

<!DOCTYPE html>

<html>

<head>

<meta charset="utf-8">

<title>20210829---</title>

</head>

<body>

<table>

<!--HTML表格的表头标签,内容加粗居中展示-->>

<tr> <th>姓名</th> <th>性别</th> <th>年龄</th> </tr>

<tr> <td>黄飞鸿</td> <td></td> <td>188</td> </tr>

<!--再多创建几个数据-->>

<tr><td>鬼脚七</td> <td></td> <td>186</td> </tr>

<tr><td>梁宽</td> <td></td> <td>33</td> </tr>

</table>

</body>

</html>

就是将表格表头那一行的<td>都换成了<th>,可以看到表头每个字段都已经居中并且加粗了。


最后我们说下表格的属性,其实表格标签属性这部分用的不多,一般都是用css样式来设置。例如表格的边框、大小等。我们需要关注的表格属性目的,有2点:

  1. 记住英文显示名称,之后使用css样式会用到
  2. 直观感受表格的外观状态

align 属性值: left right center 对应表格相对周围元素的对齐方式

border 属性值 1或"" (空) 规定表格单元是否有边框,默认为空,表示没有边框

cellpadding 像素值 规定单元边沿与其内容之间的空白,默认1像素

cellspacing 像素值 规定单元格之间的空白,默认1像素

width 像素值或百分比 规定表格的宽度


我们来看下效果:

来看下代码:

<!DOCTYPE html>

<html>

<head>

<meta charset="utf-8">

<title>20210829---</title>

</head>

<body>

<table align="center" border=1 cellpadding=1 cellspacing=1 width=500>

<!--HTML表格的表头标签,内容加粗居中展示-->>

<tr> <th>姓名</th> <th>性别</th> <th>年龄</th> </tr>

<tr> <td>黄飞鸿</td> <td></td> <td>188</td> </tr>

<!--再多创建几个数据-->>

<tr><td>鬼脚七</td> <td></td> <td>186</td> </tr>

<tr><td>梁宽</td> <td></td> <td>33</td> </tr>

</table>

</body>

</html>

记住,属性都是在table处添加和修改的,因为我们是对整个table的设置值。

好的,今天就先到这里了,大家周末愉快

T ___ InformationTechnology 信息技术

POP ___ Procedure-Oriented Programming 面向过程编程

OOA ___ Object Oriented Analysis 面对对象分析

OOD ___ Object Oriented Design 面对对象设计

OOP ___ Object Oriented Programming 面向对象编程

IOP ___ Interface-Oriented Programming 面向接口编程

AOP ___ Aspect Oriented Programming 面向切面编程

SOA ___ service-oriented architecture 面向服务的体系结构

IDE ___ Integrated Development Environment 集成开发环境

GUI ___ Graphical User Interface 图形用户界面

API ___ Application Programming Interface 应用编程接口

COM ___ Component Object Model 组件对象模型

dll ___ dynamic linked library 动态链接库

GDI ___ Graphics Device Interface 图形设备接口

GUI ___ Graphics Unser Interface 图形用户界面

Big O notation ___ Order 阶,Order of Growth, lower- order, high - order

DOS ___Disc Operating System 磁盘操作系统

UML ___ nified Modeling Language统一建模语言

MVC ___ Model–view–controller 模型、视图和控制器,MVC 模式的目的是实现一种动态的程序设计。

.net ___ NET Framework .Net框架,是由微软开发,一个致力于敏捷软件开发(Agile software development)、快速应用开发(Rapid application development)、平台无关性和网络透明化的软件开发平台。.NET框架是以一种采用系统虚拟机运行的编程平台,以通用语言运行库(Common Language Runtime)为基础,支持多种语言(C#、VB、C++、Python等)的开发。NET也为应用程序接口(API)提供了新功能和开发工具。这些革新使得程序设计员可以同时进行Windows应用软件和网络应用软件以及组件和服务(web服务)的开发。.NET提供了一个新的反射性的且面向对象程序设计编程接口。.NET设计得足够通用化从而使许多不同高级语言都得以被汇集。.NET Framework中的所有语言都提供基类库(BCL)。

目录:

0 汇编

1 C

2 C++

3 VC里面的一些类型定义和缩写

4 Java

5 数据结构与算法

6 HTML、CSS、Javascript

7 数据库相关

8 网络和服务端编程相关

9 硬件相关

10 others

11 附

0 汇编

lea ___ Load effective address

je ___ Jump if equal

leave—Leave function

mov rsp, rbp

pop rbp

jmp ___ Jump

jne ___ Jump Not Equal

jng ___ Jump Not greater than

jnl ___ Jump Not less than

jo ___ Jump Overflow

jnc ___ Jump No carry

inc ___ Increment Adds 1 to a variable.

BSS ___ Block Started by Symbol, Better Save Space

1 C

typedef ___ type definition

malloc() ___ memory allocate

atof() ___ anscii to float

seekp() ___ seek put pointer

seekg() ___ seek get pointer

strpbrk() ___ string pointer break

strcspn() ___ string complement span

isxdigit() ___ is hexadecimal digit

strtok() ___ string to tokenize

strrchr() ___ string right character

isalnurn() ___ is alpha and numeric?

isalpha() ___ is alphabetic?

#ifndef ___ if not defined

gdb___ GNU Debugger

2 C++

RAII ___ Resource Acquisition Is Initialization 资源获取即初始化

RTTI ___ Run-Time Type Identification 运行时类型识别

STL ___ Standard Template Library

ios::app ___ appends: Always appends at the end when writing

ios::ate ___ at end: Positions at the end of the file after opening

ios::trunc ___ truncate: Removes the former file contents

IOC ___ Inversion of Control 控制反转,是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找”(Dependency Lookup)。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体,将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中。

deque ___ double ended queue

POD ___ Plain Old Data 传统的C风格的struct叫做POD对象。其二进制内容是可以随便复制的,在任何地方,只要其二进制内容在,就能还原出正确无误的POD对象。memcpy,memset有很强的限制,仅能用于POD结构,不能作用于stl容器或者带有虚函数的类。带虚函数的类对象会有一个虚函数表的指针,memcpy将破坏该指针指向。

3VC里面的一些类型定义和缩写

MFC ___ Microsoft Foundation Classes 微软基础类库,是一个微软公司提供的类库(class libraries),以C++类的形式封装了Windows的API,并且包含一个应用程序框架,以减少应用程序开发人员的工作量。其中包含的类包含大量Windows句柄封装类和很多Windows的内建控件和组件的封装类。

WPF___ Windows Presentation Foundation 微软推出的基于Windows Vista的用户界面框架,属于.NET Framework 3.0的一部分。它提供了统一的编程模型、语言和框架,真正做到了分离界面设计人员与开发人员的工作;同时它提供了全新的多媒体交互用户图形界面。

LPCTSTR 是Win32 自定义数据类型, 是以null 结尾的字符串。

void CWnd::SetWindowText(LPCTSTR lpszString);

LP 表示长指针,在Win32 系统中指针没有长短之分,LP 和P 等同。
C 表示const 常量。
T 表示TCHAR。
STR 表示字符串, 等同于const TCHAR *。
sz: string terminated with zero

由于字符集分为ANSI 和Unicode 两种,对应char 和wchar_t 两种字符类型,TCHAR 是个宏定义,它根据开发环境的设置不同自动替换为char 或wchar_t, 使用TCHAR可以增强程序的可移植。

cbWndExtra ___ count of byte

GetDeviceCaps ___ Get Device's Capacities

WM_NCHITTEST ___ Not Client

DefWindowProc ___ Default

WM_TIMER ___ Windows Message

CBN_SELCHANGE ___ comboBox Notify

variable nam-ing notation:

b Boolean (true or false)

w Word, 16-bit integer

i Integer, 16-bit integer (conflicts with w )

n Short, 16-bit integer (conflicts with w )

n Near pointer (ambiguous, can be used for " short ")

p Pointer

d Double, 32-bit integer

dw Double word, 32-bit integer (conflicts with d)

l Long, 32-bit integer (conflicts with d )

fn Function (or pointer to function)

g Global

s String

sz String terminated with zero (conflicts with s )

c character

by byte (unsigned character)

h Window handle

hn Window handle (conflicts with h )

4 Java

JDK ____ Java Development Kit, The software for consumers who want to run Java programs.

JRE ___ Java Runtime Environment, The software for running Java programs on servers.

SE ___ Standard Edition, The Java platform for use on desktops and simple server applications.

EE ___ Enterprise Edition, The Java platform for complex server applications.

ME ___ Micro Edition, The Java platform for use on cell phones and other small devices.

AWT ___ Abstract Windowing Toolkit 抽象窗口工具包

JAR ___ Java ARchive

GC ___ Garbage Collection 一种自动的内存管理机制。

5 数据结构与算法

FIFO ___ First Input First Output,先入先出(队列)

LIFO ___ last in,first out,后进先出(栈)

BST ___ binary search tree,二叉搜索树

DFS ___Deepness First Search,深度优先搜索

BFS ___ Breadth-First Search,广度优先搜索算法

DP ___ Dynamic Programming,动态规划算法,一种实现记忆搜索的分治法

AVL trees ___ were invented in 1962 by two Russian computer scientists, G. M. Adelson-Velsky and E. M. Landis. An AVL tree is a well-balanced binary tree. In an AVL tree, the difference between the heights of two subtrees for every node is 0 or 1.

KMP algorithm ___ The Knuth-Morris-Pratt algorithm

6 HTML、CSS、Javascript

HTTP ___ HyperText Transfer Protocol 超文本传输协议,是一种用于分布式、协作式和超媒体信息系统的应用层协议。HTTP是万维网的数据通信的基础。

CSS ___ Cascading Style Sheet 级联样式表,是用来进行网页风格设计的。比如,如果想让链接字未点击时是蓝色的,当鼠标移上去后字变成红色的且有下划线,这就是一种风格。通过设立样式表,可以统一地控制HMTL中各标志的显示属性。级联样式表可以使人更能有效地控制网页外观。使用级联样式表,可以扩充精确指定网页元素位置,外观以及创建特殊效果的能力。

AJAX ___ Asynchronous JavaScript and XML”(异步的 JavaScript 与 XML 技术),指的是一套综合了多项技术的浏览器端网页开发技术。

JSON ___ JavaScript Object Notation 一种轻量级的数据交换语言,以文字为基础,且易于让人阅读。尽管 JSON 是 Javascript 的一个子集,但JSON是独立于语言的文本格式,并且采用了类似于 C语言 家族的一些习惯。

XML ___ eXtensible Markup Language 可扩展标记语言,是一种标记语言。标记指计算机所能理解的信息符号,通过此种标记,计算机之间可以处理包含各种信息的文章等。如何定义这些标记,既可以选择国际通用的标记语言,比如HTML,也可以使用像XML这样由相关人士自由决定的标记语言,这就是语言的可扩展性。XML是从标准通用标记语言(SGML)中简化修改出来的。它主要用到的有可扩展标记语言、可扩展样式语言(XSL)、XBRL和XPath等。

ASP ___ Active Server Page 动态服务器页面,是微软公司开发的代替CGI脚本程序的一种应用,它可以与数据库和其它程序进行交互,是一种简单、方便的编程工具,运行于 IIS 之中的程序。ASP的网页文件的格式是.asp,常用于各种动态网站中。

DOM ___ Document Object Model 文档目标模型

NaN ___ Not a Number

<a></a> ___ anchor

<h3></h3> ___ header level 3

<p></p> ___ paragraph

<tr></tr> ___ table row

<th></th> ___ table head

<td></td> ___ table data

7 数据库相关

DML ___ Data Manipulation Language 数据操纵语言 SQL 语言中,负责对数据库对象运行数据访问工作的指令集,以 INSERT、UPDATE、DELETE 三种指令为核心,分别代表插入、更新与删除,是开发以数据为中心的应用程序必定会使用到的指令,因此有很多开发人员都把加上SQL的SELECT语句的四大指令以“CRUD”来称呼

ADO ___ ActiveX Data Objects) 是一个用于存取数据源的COM组件。它提供了编程语言和统一数据访问方式OLE DB的一个中间层。允许开发人员编写访问数据的代码而不用关心数据库是如何实现的,而只用关心到数据库的连接。

SQL ___ Structured Query Language 结构化查询语言,是一种特定目的程序语言,用于管理关系数据库管理系统(RDBMS),或在关系流数据管理系统(RDSMS)中进行流处理。

NoSQL 是对不同于传统的关系数据库的数据库管理系统的统称。

8 网络和服务端编程相关

DNS ___ Domain Name System 域名系统,是互联网的一项服务。它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。DNS使用TCP和UDP端口53。当前,对于每一级域名长度的限制是63个字符,域名总长度则不能超过253个字符。

CGI ___ Common Gateway Interface 通用网关接口,是一个Web服务器主机提供信息服务的标准接口。通过CGI接口,Web服务器就能够获取客户端提交的信息,转交给服务器端的CGI程序进行处理,最后返回结果给客户端。组成CGI通信系统的是两部分:一部分是html页面,就是在用户端浏览器上显示的页面。另一部分则是运行在服务器上的Cgi程序。servlet是CGI替代品。

IIS ___ Internet Information Services 互联网信息服务,是由微软公司提供的基于运行Microsoft Windows的互联网基本服务。最初是Windows NT版本的可选包,随后内置在Windows 2000、Windows XP Professional和Windows Server 2003一起发行,但在Windows XP Home版本上并没有IIS。

C/S ___ Client/Server 客户端-服务器架构,是一种网络架构,它把客户端 (Client) (通常是一个采用图形用户界面的程序)与服务器 (Server) 区分开来。每一个客户端软件的实例都可以向一个服务器或应用程序服务器发出请求。有很多不同类型的服务器,例如文件服务器、游戏服务器等。

FTP ___ File Transfer Protocol 文件传输协议

ADSL ___ Asymetrical Digital Subscriber Line 非对称数字用户线路

ARP ___ Address resolution Protocol 地址解析协议

ICMP ___ Internet Control and Message Protocol Internet控制消息协议

ICP ___ Internet Content Provider 互联网内容供应商

IMAP ___ Internet message Access Protocol 报文存取协议

IP ___ Internet Protocol 网际协议

LAN ___ Local Area Network 局域网

PING ___ Packet Internet Grable

PPPOE ___ Point to Point Protocol Over Ethernet

POP3 ___ Post Office Protocol Version 3

9 硬件相关

CPU ___ Central Process Unit 中央处理单元

ALU ___ arithmetic and logic unit 算术逻辑单元

BIOS ___ Basic Input Output System 基本输入输出系统

ROM ___ Rread_Only Memory 只读存储器

EPROM ___ erasable programmable ROM 可擦写可编程ROM

SRAM ____ Static Ramdom Access Memory 静态随机存储器

GPU Graphic Processing Unit

PCI ___ Peripheral component Interconnection 互联外围设备

DPI Dots Per Inch 每英寸点数

10 others

JVM ___ Java Virtual Machine Java 虚拟机,是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域。 JVM屏蔽了与具体操作系统平台相关的信息,使Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。JVM在执行字节码时,实际上最终还是把字节码解释成具体平台上的机器指令执行。编译虚拟机的指令集与编译微处理器的指令集非常类似。

RA ___ Requirement Analysis 需求分析

IEEE___ Institute of Electrical and Electronic Engineer 电子电气工程师协会

GIF ___ Graphics Interchange Format

JPEG ___ Joint Photographic Expert Group 一个静态图压缩标准

MP3 ___ MPEG Audio Layer3

MPEG ___ Moving Picture Expert Group 动态图像专家

OCR Optical Character Recognition 光学字符识别

OLE ObjectLinking and Embedding 对象连接与嵌入,简称OLE技术

PDF ___ Portal Document Format 可移植文档格式

PHP ___ Hypertext Proprocessor 超文本预处理器

PNP ___ Plug and Play

POST ____ Power On Self Test

11 附:

11.1 英文缩写搜索

http://m.shortof.com/

11.2 一些英文缩写

缩写

全称

addr

Address

adm

Administrator

app

Application

arg

Argument

asm

assemble

asyn

asynchronization

avg

average

DB

Database

bk

back

bmp

Bitmap

btn

Button

buf

Buffer

calc

Calculate

char

Character

chg

Change

clk

Click

clr

color

cmd

Command

cmp

Compare

col

Column

coord

coordinates

cpy

copy

ctl / ctrl

Control

cur

Current

cyl

Cylinder

dbg

Debug

dbl

Double

dec

Decrease

def

default

del

Delete

dest / dst

Destination

dev

Device

dict

dictionary

diff

different

dir

directory

disp

Display

div

Divide

dlg

Dialog

doc

Document

drv

Driver

dyna

Dynamic

env

Environment

err

error

ex/ext

Extend

exec

execute

flg

flag

frm

Frame

func / fn

Function

grp

group

horz

Horizontal

idx / ndx

Index

img

Image

impl

Implement

inc

Increase

info

Information

init

Initial/Initialize/Initialization

ins

Insert

inst

Instance

INT / intr

Interrupt

len

Length

lib

Library

lnk

Link

log

logical

lst

List

max

maximum

mem

Memory

mgr / man

Manage / Manager

mid

middle

min

minimum

msg

Message

mul

Multiply

num

Number

obj

Object

ofs

Offset

org

Origin / Original

param

Parameter

pic

picture

pkg

package

pnt / pt

Point

pos

Position

pre / prev

previous

prg

program

prn

Print

proc

Process / Procedure

prop

Properties

psw

Password

ptr

Pointer

pub

Public

rc

rect

ref

Reference

reg

Register

req

request

res

Resource

ret

return

rgn

region

scr

screen

sec

Second

seg

Segment

sel

Select

src

Source

std

Standard

stg

Storage

stm

Stream

str

String

sub

Subtract

sum

summation

svr

Server

sync

Synchronization

sys

System

tbl

Table

temp / tmp

Temporary

tran / trans

translate/transation/transparent

tst

Test

txt

text

unk

Unknown

upd

Update

upg

Upgrade

util

Utility

var

Variable

ver

Version

vert

Vertical

vir

Virus

wnd

Window

-End-

- 作者 谢恩铭 转载请注明出处


《Linux探索之旅》全系列

内容简介


  1. 前言

  2. 成果展示

  3. 解题步骤和答案

  4. 可能的优化

  5. 第五部分第九课预告

1. 前言


上一课 Linux探索之旅 | 第五部分第七课:Shell实现图片展示网页 中,我们做了一个有趣的练习。

这个练习用一个 Shell 脚本来生成一个 HTML 文件,这个 HTML 文件是一个展示图片缩略图的网页,点击每个缩略图还会链接到原始图片。

这一课我们继续做一个进阶的 Shell 脚本练习。这个练习要实现的是对一个英语字典做统计。

通过这个练习,你将巩固 Shell 和 Linux 的知识点。

为了完成它,我们需要用到一个文本文件:words.txt。这是一个包含 354935 个英文单词的字典,请从我的 Github 上下载 (下面也会给出百度云盘下载链接):

https://github.com/frogoscar/english-dictionary

你可以选择 git clone 到你本地目录,或者下载 zip 压缩包。然后提取里面的 words.txt 文件即可。

对于 Git 和 Github 的使用有任何疑问,欢迎阅读我的文章 :Git,Github和Gitlab简介和基本使用

对于不用 Github 的朋友,我也把字典文件上传到百度云盘了,请 点我下载 。

当然了,如果你自己能在网上找到其他完整的英文字典的文本文档也可以,不一定要用我这个。

2. 成果展示


我们要用到的字典文本文档里的内容类似如下:

字典开头

字典结尾

我们要写一个 Shell 脚本,来显示这个庞大的字典中 26 个英文字母(从 a 到 z )出现的次数,而且以次数最多到最少的顺序排列。

成果是像下面这样的:

可以看到,字母 e 出现的次数最多,是 363325 次; 字母 j 出现的次数最少,是 5073 次。

下面给出我的解题步骤和答案,希望大家最好先不看答案,尝试着自己解决问题,然后再来看答案。

你的解法也许比我还要好。相信你可以的,加油!

3. 解题步骤和答案


首先,我们创建一个文件夹,然后把 words.txt 这个字典文件放进去。

然后,我们在文件夹中创建一个文件,就是我们的脚本,叫 statistics.sh 好了,因为 statistics 是英语「统计」的意思。

vim statistics.sh

因为这个练习涉及到数据的处理,所以可以回去参考 Linux探索之旅 | 第三部分第一课:数据处理,慢条斯理 那一课。

还有 「管道、流、重定向」 ( Linux探索之旅 | 第三部分第二课:流、管道、重定向,三管齐下 )等等。

你也许还会在使用一些命令时忘了如何用,那你可以查一下命令的使用手册 ( Linux探索之旅 | 第二部分第八课:RTFM 阅读那该死的手册 )。

根据上面的成果那张截图,我们可以看到要实现的是 :

「在终端打印出结果,按照字母出现的次数来排列,由最多到最少。在次数左边,依次是 该次数对应的字母、空格、短横杠、空格。而且每个字母是大写的(在字典文件中字母都是小写,因此需要小写到大写的转换)」。

因此,我们首先需要统计每个字母出现的次数。

怎么做呢?我们想到了 grep 命令,它可以帮助我们在文件中查找所需的字母。

我们首先用命令行来测试,之后再着手编写我们的 statistics.sh 这个文件。

首先,在命令行中输入以下命令:

grep -io a words.txt

回车运行后可以看到输出了许多行,每一行包含一个 a。

因为 grep 就是用于在文件中查找关键字,并且显示关键字所在的行。

这里我们用了 -i 和 -o 两个参数。-i 参数我们之前学过,是 ignore-case 的简写,表示「忽略大小写」。

而-o 这个参数我们之前没学过,不过可以用 man grep 来看看:

man grep

可以看到 -o 参数中的 o 是英语 only-matching 的简写,表示「只匹配」。其描述 「 Print only the matched (non-empty) parts of a matching line, with each such part on a separate output line. 」可以翻译为 「只显示匹配行中不为空的那个匹配的部分,每个这样的部分被单独显示在一行上」。

如果不加 -o 参数而直接用

grep -i a words.txt

那么输出是这样的:

理解了吗?不加 -o 参数,那么 grep 就会输出每一个包含 a 的行。而每一行 (字典文件中一行有一个单词)也许包含不止一个 a。因此为了统计所有的 a,我们须要加上 -o 参数。

既然我们已经用 grep -io a words.txt 命令来输出了所有字母 a 的 出现(逐行显示),那么我们可以用 wc -l 命令来统计行数,即可知道 a 的出现次数了。

接下来我们就用管道来把 grep 命令的结果赋给 wc 命令:

grep -io a words.txt | wc -l

可以看到输出是 273400,表示 words.txt 文件中字母 a 出现了 273400 次。

我们也可以不加 -o 参数来测试一下:

grep -i a words.txt | wc -l

可以看到输出是 206518,比 273400 少了很多,因为不加 -o 参数只统计了 a 出现的那些行(相当于统计了包含 a 的单词数目),而不是统计 a 的真正出现次数。

我们现在已经知道如何统计字母 a 的次数了,那么举一反三,统计其他 25 个字母也不在话下。我们可以用一个循环语句来实现:

for char in {a..z}; do

可以看到我们在终端输入 for 循环语句后,依次打印出了 a, b, c, 一直到 z 这 26 个字母在 words.txt 文件中出现的次数。

虽然现在我们只是开了个头,但是已经可以来写我们的 Shell 脚本了。

我们首先写一些基础的部分:

#!/bin/bash# Verification of parameter# 确认参数if [ -z  ]

上面两段代码分别用于确认参数和确认文件存在,如果不满足 if 条件,那么用 echo 显示提示信息,然后用 exit 命令退出 Shell。

然后,我们来定义一个函数,就叫 statistics 好了,我们继续在 statistics.sh 这个文件中加入以下代码:

# Definition of function# 函数定义statistics () { for char in {a..z}

for char in {a..z} 不难理解,用于遍历 a 到 z 这 26 个英语字母。

echo "$char - `grep -io "$char" | wc -l`" 这句首先用 echo 命令输出 char 变量的值 (依次取值 a 到 z ),然后输出一个空格,输出短横杠,再输出一个空格,然后输出 grep -io "$char" | wc -l 这句命令的运行结果,也就是 char 变量对应的字母的出现次数 。

我们运行这个脚本(别忘了用 chmod +x statistics.sh 为脚本加上可执行权限):

./statistics.sh words.txt

可以看到我们的脚本文件如我们所愿从 a 到 z 输出了这 26 个字母,格式也是我们需要的:

字母 - 出现次数

但是,目前我们的字母没有大写,而且还不是按出现次数最多到最小排序的,因此我们还要继续探索。

为了使 echo 命令的输出中的小写字母被转成大写,我们可以用 tr 命令。tr 是 translate 的缩写,表示「翻译,转化」。

我们的函数改为如下:

# Definition of function# 函数定义statistics () { for char in {a..z}

tr /a-z/ /A-Z/ 表示把所有 a 到 z 的小写字母转为对应的大写字母 A-Z。

这下我们的字母已经都变成大写了,我们还剩最后一点没做:对这 26 行输出根据字母出现次数排序。

为了实现这个,我们需要用到 sort 命令,sort命令用于对文件的行进行排序。

我们还需要一个中转的文件,用于暂时储存我们的 echo 命令循环输出的这 26 行数据。

因此我们可以用输出重定向来把 echo "$char - `grep -io "$char" | wc -l`" | tr /a-z/ /A-Z/ 的结果依次写入一个文件,比如取名为 tmp.txt。

然后再用 sort 命令对这个文件的行进行排序,把排序结果显示到终端。

我们的函数改为如下:

# Definition of function# 函数定义statistics () { for char in {a..z}

我们在 echo "$char - `grep -io "$char" | wc -l`" | tr /a-z/ /A-Z/ 之后加了 >> tmp.txt,以把输出重定向到文件 tmp.txt 末尾。

然后用 sort 命令对 tmp.txt 文件中的行进行排序。

我们用了 sort 命令的 -r,-n,-k 和 -t 四个参数。

其中 -r 和 -n 参数我们比较熟悉,-n 参数用于对数字排序,-r 参数用于倒序排列。

-k 参数用于指定根据哪几列进行排序,这里用 -k 2 表示根据第 2 列来排序。

-t 参数用于指定列和列之间用什么作为分隔符,这里用 -t - 表示分隔符是 - 。

然后每次我们都要把 tmp.txt 这个临时文件删除,用 rm tmp.txt

我的最终代码:

#!/bin/bash# Verification of parameter

# 确认参数if [ -z $1 ]

上面只是我的解法,你的解题思路和代码当然不必和我一样。而且我也非常肯定我的代码不够优。

我相信各位能想出更好的解法,欢迎留言补充(如果留言支持代码,可以把你的代码贴出来)。

这个程序虽然短小,但是我们用到了 Linux 中的 grep 命令,sort 命令,wc 命令,rm 命令,echo 命令,exit 命令,管道 ( | ),重定向( >> )。Shell 中的条件语句 ( if ),循环语句 ( for ),函数,等知识点。

4. 可能的优化


我给出的解方是基础的,你可以自由发挥。

下面提出几点优化的设想:

  1. 除了第一个参数,也就是要统计的字典文件的名字,我们还可以添加其他参数,来完成更多任务。

  2. 改变输出的形式,使之更美观。

  3. 每一行可以输出更多信息。

  4. 尝试不借助中间文件 tmp.txt。

其他优化,就有待大家去发挥自己的想象力咯!

5. 第五部分第九课预告


今天的课就到这里,一起加油吧!

下一课我们来做一些测试吧 :第五部分测试题

然后就进入第六部分了。

微信公众号「程序员联盟」ProgrammerLeague

我是[谢恩铭](http://www.jianshu.com/u/44339a8a9afa),在巴黎奋斗的软件工程师。

[我的简介](http://www.jianshu.com/p/e1c5835fee7d)

[我的经历](http://www.jianshu.com/p/86c2cfe3b390)

热爱生活,喜欢游泳,略懂烹饪。

人生格言:“向着标杆直跑”