查看linux系统版本命令

Posted on

查看linux系统版本命令

查看linux系统版本命令

一。查看内核版本命令:

1) [root@SOR_SYS ~]/# cat /proc/version Linux version 2.6.18-238.el5 (mockbuild@x86-012.build.bos.redhat.com) (gcc version 4.1.2 20080704 (Red Hat 4.1.2-50)) /#1 SMP Sun Dec 19 14:22:44 EST 2010 [root@SOR_SYS ~]/#

2)[root@SOR_SYS ~]/# uname -r 2.6.18-238.el5 3)[root@SOR_SYS ~]/# uname -a Linux SOR_SYS.99bill.com 2.6.18-238.el5 /#1 SMP Sun Dec 19 14:22:44 EST 2010 x86_64 x86_64 x86_64 GNU/Linux [root@SOR_SYS ~]/#

二。查看linux版本:

1) 登录到服务器执行 lsb_release -a ,即可列出所有版本信息,例如:

[root@SOR_SYS ~]/# lsb_release -a LSB Version: :core-4.0-amd64:core-4.0-ia32:core-4.0-noarch:graphics-4.0-amd64:graphics-4.0-ia32:graphics-4.0-noarch:printing-4.0-amd64:printing-4.0-ia32:printing-4.0-noarch Distributor ID: RedHatEnterpriseAS Description: Red Hat Enterprise Linux AS release 4 (Nahant Update 4) Release: 4 Codename: NahantUpdate4 [root@SOR_SYS ~]/#

注:这个命令适用于所有的linux,包括Redhat、SuSE、Debian等发行版。

2) 登录到linux执行cat /etc/issue,例如如下:

[root@SOR_SYS ~]/# cat /etc/issue Red Hat Enterprise Linux Server release 5.6 (Tikanga) Kernel \r on an \m

[root@SOR_SYS ~]/#

3) 登录到linux执行cat /etc/redhat-release ,例如如下:

[root@SOR_SYS ~]/# cat /etc/redhat-release Red Hat Enterprise Linux AS release 4 (Nahant Update 4) [root@SOR_SYS ~]/#

注:这种方式下可以直接看到具体的版本号,比如 AS4 Update 1

4)登录到linux执行rpm -q redhat-release ,例如如下:

[root@SOR_SYS ~]/# rpm -q redhat-release redhat-release-5Server-5.6.0.3 [root@SOR_SYS ~]/#

注:这种方式下可看到一个所谓的release号,比如上边的例子是5

这个release号和实际的版本之间存在一定的对应关系,如下:

redhat-release-3AS-1 -> Redhat Enterprise Linux AS 3

redhat-release-3AS-7.4 -> Redhat Enterprise Linux AS 3 Update 4

redhat-release-4AS-2 -> Redhat Enterprise Linux AS 4

redhat-release-4AS-2.4 -> Redhat Enterprise Linux AS 4 Update 1

redhat-release-4AS-3 -> Redhat Enterprise Linux AS 4 Update 2

redhat-release-4AS-4.1 -> Redhat Enterprise Linux AS 4 Update 3

redhat-release-4AS-5.5 -> Redhat Enterprise Linux AS 4 Update 4

另:第3)、4)两种方法只对Redhat Linux有效

5) [root@SOR_SYS ~]/# file /bin/bash /bin/bash: ELF 64-bit LSB executable, AMD x86-64, version 1 (SYSV), for GNU/Linux 2.6.9, dynamically linked (uses shared libs), for GNU/Linux 2.6.9, stripped [root@SOR_SYS ~]/#

6) [root@SOR_SYS ~]/# file /bin/cat /bin/cat: ELF 64-bit LSB executable, AMD x86-64, version 1 (SYSV), for GNU/Linux 2.6.9, dynamically linked (uses shared libs), for GNU/Linux 2.6.9, stripped [root@SOR_SYS ~]/# 来源: [http://blog.csdn.net/zhuying_linux/article/details/6859286](http://blog.csdn.net/zhuying_linux/article/details/6859286)

Linux下查看端口占用情况

用启动服务的账号登录,然后运行命令: lsof -i:<端口号>

例如: www.2cto.com

Linux代码
[root@SonarServer1 user0]/# lsof -i:80

也可使用命令:

netstat -apn|grep <端口号> 例如:

Linux代码
[root@SonarServer1 user0]/# netstat -apn|grep 80

tcp 0 0 :::80 :::/* LISTEN 19408/java
找到进程号以后,再使用以下命令查看详细信息:

ps -aux|grep <进程号>

来源: [http://www.2cto.com/os/201210/164245.html](http://www.2cto.com/os/201210/164245.html)

linux之sort用法

Posted on

linux之sort用法

sort命令是帮我们依据不同的数据类型进行排序,其语法及常用参数格式: sort [-bcfMnrtk][源文件][-o 输出文件] 补充说明:sort可针对文本文件的内容,以行为单位来排序。

参  数: -b 忽略每行前面开始出的空格字符。 -c 检查文件是否已经按照顺序排序。 -f 排序时,忽略大小写字母。 -M 将前面3个字母依照月份的缩写进行排序。 -n 依照数值的大小排序。 -o<输出文件> 将排序后的结果存入指定的文件。 -r 以相反的顺序来排序。 -t<分隔字符> 指定排序时所用的栏位分隔字符。 -k 选择以哪个区间进行排序。 ~~~~~~~~~~

下面通过几个例子来讲述Sort的使用。 (1)sort将文件的每一行作为一个单位,相互比较,比较原则是从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出。

[rocrocket@rocrocket programming]$ cat seq.txt banana apple pear orange [rocrocket@rocrocket programming]$ sort seq.txt apple banana orange pear

用户可以保存排序后的文件内容,或把排序后的文件内容输出至打印机。下例中用户把排序后的文件内容保存到名为result的文件中。 $ Sort seq.txt > result

(2)sort的-u选项

它的作用很简单,就是在输出行中去除重复行。

[rocrocket@rocrocket programming]$ cat seq.txt banana apple pear orange pear [rocrocket@rocrocket programming]$ sort seq.txt apple banana orange pear pear [rocrocket@rocrocket programming]$ sort -u seq.txt apple banana orange pear

pear由于重复被-u选项无情的删除了。

(3)sort的-r选项

sort默认的排序方式是升序,如果想改成降序,就加个-r就搞定了。

[rocrocket@rocrocket programming]$ cat number.txt 1 3 5 2 4 [rocrocket@rocrocket programming]$ sort number.txt 1 2 3 4 5 [rocrocket@rocrocket programming]$ sort -r number.txt 5 4 3 2 1 (5)sort的-o选项

由于sort默认是把结果输出到标准输出,所以需要用重定向才能将结果写入文件,形如sort filename > newfile。

但是,如果你想把排序结果输出到原文件中,用重定向可就不行了。

[rocrocket@rocrocket programming]$ sort -r number.txt > number.txt [rocrocket@rocrocket programming]$ cat number.txt [rocrocket@rocrocket programming]$ 看,竟然将number清空了。

就在这个时候,-o选项出现了,它成功的解决了这个问题,让你放心的将结果写入原文件。这或许也是-o比重定向的唯一优势所在。

[rocrocket@rocrocket programming]$ cat number.txt 1 3 5 2 4 [rocrocket@rocrocket programming]$ sort -r number.txt -o number.txt [rocrocket@rocrocket programming]$ cat number.txt 5 4 3 2 1

(6) sort的-n选项

你有没有遇到过10比2小的情况。我反正遇到过。出现这种情况是由于排序程序将这些数字按字符来排序了,排序程序会先比较1和2,显然1小,所以就将10放在2前面喽。这也是sort的一贯作风。

我们如果想改变这种现状,就要使用-n选项,来告诉sort,“要以数值来排序”!

[rocrocket@rocrocket programming]$ cat number.txt 1 10 19 11 2 5 [rocrocket@rocrocket programming]$ sort number.txt 1 10 11 19 2 5 [rocrocket@rocrocket programming]$ sort -n number.txt 1 2 5 10 11 19

(7) sort的-t选项和-k选项

如果有一个文件的内容是这样:

[rocrocket@rocrocket programming]$ cat facebook.txt banana:30:5.5 apple:10:2.5 pear:90:2.3 orange:20:3.4

这个文件有三列,列与列之间用冒号隔开了,第一列表示水果类型,第二列表示水果数量,第三列表示水果价格。那么我想以水果数量来排序,也就是以第二列来排序,如何利用sort实现?幸好,sort提供了-t选项,后面可以设定间隔符。指定了间隔符之后,就可以用-k来指定列数了。

[rocrocket@rocrocket programming]$ sort -n -k 2 -t ‘:’ facebook.txt apple:10:2.5 orange:20:3.4 banana:30:5.5 pear:90:2.3

(8) 其他的sort常用选项

-f会将小写字母都转换为大写字母来进行比较,亦即忽略大小写

-c会检查文件是否已排好序,如果乱序,则输出第一个乱序的行的相关信息,最后返回1

-C会检查文件是否已排好序,如果乱序,不输出内容,仅返回1

-M会以月份来排序,比如JAN小于FEB等等

-b会忽略每一行前面的所有空白部分,从第一个可见字符开始比较。 来源: [http://www.cnblogs.com/dong008259/archive/2011/12/08/2281214.html](http://www.cnblogs.com/dong008259/archive/2011/12/08/2281214.html)

linux 命令 字符集

Posted on

linux 命令 字符集

locale -a 查看本地字符集 locale -m 查看所有支持的字符集 echo $LANG

用export LANG=zh_CN.UTF-8这样只下次重起又要重设置

修改 /etc/sysconfig/i18n 文件,如 LANG="en_US",xwindow会显示英文界面, LANG="zh_CN.GB18030",xwindow会显示中文界面。

编辑/etc/sysconfig/i18n这个文件, LANG="zh_CN.GB18030" SUPPORTED="zh_CN.GB18030:zh_CN:zh:en_US.UTF-8:en_US:en" SYSFONT="latarcyrheb-sun16" 保存,重起.OK了 注: I18N 是 internationalization 的缩写形式,意即在 i 和 n 之间有 18 个字母,本意是指软件的“国际化”. I18N支持多种语言,但是同一时间只能是英文和一种选定的语言,例如英文+中文、英文+德文、英文+韩文等等; 原来的: LANG="zh_CN.UTF-8" SUPPORTED="zh_CN.UTF-8:zh_CN:zh" SYSFONT="latarcyrheb-sun16" 来源: [http://www.cnitblog.com/windone0109/archive/2008/04/28/42901.html](http://www.cnitblog.com/windone0109/archive/2008/04/28/42901.html)

漫步云中网络

Posted on

漫步云中网络

张 华, 高级软件工程师, IBM

龚 永生, 资深软件工程师, IBM

简介: 在生产环境中,云中的网络通常被划分为公共网络、管理网络和服务网络。本文首先通过三个小试验向您介绍了如何通过 TAP/TUN、NAT、Linux Bridge、VLAN 等技术实现云中网络的一般原理。有了这些基础,相信您会对接下来介绍的一个具体的 OpenStack 云的示例网络配置倍感亲切。同理,这些基础也将助您在其他云中网络中轻松漫步。 来源: [http://www.ibm.com/developerworks/cn/cloud/library/1209_zhanghua_openstacknetwork/](http://www.ibm.com/developerworks/cn/cloud/library/1209_zhanghua_openstacknetwork/)

阅读本文前,最好能先了解以下的知识:

  • 了解 OpenStack 将有助于对本文的理解。本文讲解的是 Linux 虚拟网络中的一般原理方法 , 虽不仅限于应用在 OpenStack 之中 , 但本文的实验是以 OpenStack 为基础的。OpenStack 是一个开源的 IaaS 云 , 您可以从 devstack 脚本 (http://devstack.org/) 开始熟悉它。
  • 了解 QEMU 也将有助于对本文的理解。QEMU 是一种支持多种 CPU 的机器模拟器 , 本文采用 QEMU 来创建虚拟机验证本文中的试验。

什么是云?

什么是云?我的理解是,为多租户提供各层次上的服务(如操作系统层、中间件层、应用软件层等)的可动态水平扩展的服务器集群称之为云。所以云具有大规模、高可扩展性、按需服务、自动化、节能环保、高可靠性等特点。下图1从软件堆栈视角勾画了云的架构: 图 1. 云的架构 图 1. 云的架构

  • IaaS, Infrastructure as a Service,基础设施即服务:您可以简单理解为将可伸缩的操作系统(虚机或实机)实例作为基础设施服务卖给多租户,然后按需计算费用。当然,将操作系统作为基础设施服务只是 IaaS 中的一种,且是最主要的一种,我怕大家概念混淆所以就只重点提了这种。实际上,只要是基础设施提供服务了从概念上讲都应该叫 IaaS,比如说关系型数据库,如果是集群部署的话,它也是基础设施提供服务了,也应该叫 IaaS。这类产品如 IBM 的 Smart Cloud Entry,如开源的 OpenStack。
  • PaaS, Platform as a Service, 平台即服务:您可以简单理解为将可伸缩的中间件资源作为平台服务卖给多租户,然后按需计算费用。举个例子,如果 SaaS 应用程序的并发瞬间加大的话,PaaS 可以自动实时地启动一个由 IaaS 提供的操作系统实例,然后自动在它上面部署中间件应用服务器(如 IBM 的 WebSphere),最后再部署一套该 SaaS 应用实例,并自动将它们纳入到负载均衡体系之中,从而实现平台服务的自动伸缩,这就是 PaaS。这类产品如 IBM 的 IWD,如 Google 的 App Engine。
  • SaaS, Software as a Service, 软件即服务:您可以简单理解为可伸缩的分布式软件作为软件服务为用户提供某种在线服务,如视频服务,地图服务等。
  • XaaS, X as a Server, 一切即服务:只要是给多租户按需提供服务都可以叫 XaaS, 像在 OpenStack 中,将网络部分代码单独抽出来组成 Quantum 工程,就可以叫网络即服务(NaaS, Network as a Service);像使用 xCat 自动部署裸机可以叫裸机即服务(MaaS, Bare-metal as a Service)。

回页首

什么是云中网络?

在传统的数据中心中,每个网口对应唯一一个物理机;有了云,一台物理网卡可能会承载多个虚拟网卡。物理网卡与虚拟网卡之间的关系无外乎就是下列三种情况:

  1. 一对一,一个物理网卡对应对一个虚拟网卡,是下面一对多情况的一种特例
  2. 一对多,一个物理网卡对应多个虚拟网卡,是本文要介绍的情况
  3. 多对一,多个物理网对应一个虚拟网卡,即我们常说的 Bonding,用作负载均衡 图 2. 虚拟网络的主要内容 图 2. 虚拟网络的主要内容

上图 2 显示了虚拟网络的主要内容:

  1. 目前,对网络的虚拟化主要集中在第 2 层和第 3 层
  2. 在 Linux 中,第 2 层通常使用 TAP 设备来实现虚拟网卡,使用 Linux Bridge 来实现虚拟交换机
  3. 在 Linux 中,第 3 层通常是基于 Iptable 的 NAT,路由及转发
  4. 对于网络隔离,可以采用传统的基于 802.1Q 协议的 VLAN 技术,但这受限于 VLAN ID 大小范围的限制,并且需要手动地在各物理交换机上配置 VLAN;也可以采用虚拟交换机软件,如 Openvswitch,它可以自动创建 GRE 隧道来避免手动去为物理交换机配置 VLAN。

下面将结合一个生产环境中的网络实例来讲解如何实现一个虚拟网络。

回页首

云中网络实验

在生产环境中,按通用做法一般将云中网络划分为三大部分,公共网络、管理&存储网络、服务网络。

公共网络:用于云向外部租户提供 API 调用或者访问

管理网络:用于云中各物理机之间的通信

存储网络:用于 iSCSI 服务端与客户端之间的流量,一般与管理网络同

服务网络:虚机内部使用的网络

为了将上述网络的实现原理讲清楚,我们选择了两台物理机做实验,并将采用 NAT、Linux Bridge、VLAN 技术分步实现一个典型的 OpenStack 云的网络拓扑。当然,这种网络的原理是通用的,并不仅限于 OpenStack 云。

  1. 台式机 (node1), 双有线网卡, 将作为控制节点、存储节点及一个计算节点
  2. 笔记本 (node2),一有线网卡,将作为一个计算节点
  3. 路由器,家中 ADSL 宽带出口
  4. 交换机 , 用于连接各物理机

值得一提的是,如果采用了 VLAN 技术进行网络隔离,且想要两台物理机上的虚机能够互访的话,交换机必须是支持 VLAN 的,且需要手动将交换机相应的端口配置成 Trunk 模式。因为我没有支持 VLAN 的物理交换机,在本实验中,我是采用直连线直接连接两台实验机器的。

下图 3 显示了实验网络拓扑: 图 3. OpenStack 实验网络拓扑

公共网络:192.168.99.0/24 网段,外网用户通过公共网络上提供的服务来访问云。注意:在实际的生产环境中,公共网络一般采用外网 IP,因为我没有外网 IP,所以用 192.168.99.0 网段模拟。将台式机的一有线网卡 eth1 与 TP-Link 路由器相连即可。

管理&存储网络:172.16.99.0/24 网段,管理网络用于 OpenStack 各组件以及 DB、MQ 之间进行通信;存储网络用于存储节点和需要使用外部存储的计算节点之间的通信。将台式机的另一有线网卡 eth0 和笔记本电脑的有线网卡 eth0 连接到交换机即可。

服务网络:10.0.0.0/8 网段,用于虚机内部。

两个节点的基本网络配置如下: 清单 1. node1 的基本网络配置

root@node1:/home/hua/# cat /etc/network/interfaces auto lo

iface lo inet loopback auto eth1

iface eth1 inet dhcp up iptables -t nat -A POSTROUTING -s 172.16.99.0/24 -o eth1 -j MASQUERADE

auto eth0 iface eth0 inet static

address 172.16.99.108 netmask 255.255.255.0

network 172.16.99.0 broadcast 172.16.99.255

清单 2. node2 的基本网络配置 [

cat /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0

HWADDR=00:21:86:94:63:27 ONBOOT=yes

BOOTPROTO=static USERCTL=yes

PEERDNS=yes IPV6INIT=no

NM_CONTROLLED=yes TYPE=Ethernet

NETMASK=255.255.255.0 IPADDR=172.16.99.109

NETWORK=172.16.99.0 GATEWAY=172.16.99.108

DNS1=202.106.195.68 DNS2=202.106.46.151

我虽然只用了两台物理机来模拟实际生产环境的部署模型, 但文中的这种部署结构是典型的,如果是大规模部署的话,只需要将控制节点上的每一个进程(如 DB、MQ、glance、keystone、nova-api、nova-schedule、nova-network 等)分布部署在每一台物理机即可。想要进一步的 HA 的话,可以:

  • 将 DB 配置成集群模式
  • 将 MQ 配置成集群模式
  • 采用 multi-host 模式,将 nova-network 同时安装在计算节点 (nova-compute) 上
  • 将 nova-api、nova-schedule 这些无状态的服务也同时部署在计算节点上,再加上负载均衡器分发负载
  • 采用多网卡做 Bonding ]()

NAT

node2 可以通过 NAT 方式访问外网,数据流向如下:

  1. node2 中需设置网关指向 node1 的 eth0,例: GATEWAY=172.16.99.108
  2. 在 node1 中打开 ipv4 转发功能,这样,node1 会相当于一台路由器,在 eth0 收到来自 node2 的数据之后,会将数据包转发到其他网卡 eth1, sysctl -w net.ipv4.ip_forward=1
  3. 在 node1 上设置 NAT 规则,这样,从 node2(172.16.99.0/24 网段)发出的数据包看来起就像从 node1 的 eth1 发出的一样: iptables -t nat -A POSTROUTING -s 172.16.99.0/24 -o eth1 -j MASQUERADE

Linux Bridge

网桥 ( Bridge ) 工作在二层,了解链路层协议,按帧转发数据。就是交我们常说的交换机,所以连接到网桥的设备处于同一网段。 图 4. 网桥示例 图 4. 网桥示例

上图 4 显示了 node1 网桥中的 VM1 与 node2 网桥中的 VM2 是如何通信的。在 openstack 中,这是典型的 multi-host 模式,即每一个计算节点均部署了网络服务来提供网关服务。Linux Bridge 充当了交换机的功能,而将 sysctl -w net.ipv4.ip_forward 设置为 1 也相当于 node1 同时充当了一个路由器(路由器的实质就是一个具有多个网卡的机器,因为它的多网卡同时具有这些不同网段的 IP 地址,所以它能将一个网络的流量路由转发到另一个网络)。

网桥,交换机,是用来连接两个 LAN 的。 是根据 MAC 与端口的映射进行转发的,而在虚机的网卡都是知道的,若从转发数据库知道目的 MAC 地址,以太网帧就只会正确的网桥端口传输,否则,就会扩散到网桥设备的所有端口。

因为网桥工作在第二层,所以 eth0.1, tap0, tap1 这些网卡均不需要设置 IP(因为对于上层路由器来说,它们是同一个子网,只需要将 IP 设置在 br1 上即可)。同时, 对 Linux 而言,网桥是虚拟设备,因此,除非将一个或多个真实设备绑定到网桥设备上,否则它就无法接收或传输任何东西。所以需要将一个真实设备(如 eth0)或者真实设备的 vlan 接口(如 eth0.1) 加入到网桥。对于前一种情况,将 eth0 加入到网桥之后,eth0 便不再具有 IP,这时候它与 tap0 这些虚拟网卡均通过 br1 处于 10.0.1.0/24 网络,当然我们也可以为网桥 br1 设置一个别名让它也具有 172.16.99.0/24 网管网段的 IP 地址。)

下面,我们来实现这个示例网桥,在 node1 与 node2 上分别执行下述脚本(对重要命令的描述请参见注释): 清单 3. node1 与 node2 的 Linux Bridge 配置脚本

/#!/bin/sh TAP=tap0

BRIDGE=br1 IFACE=eth0

MANAGE_IP=172.16.99.108

SERVICE_IP=10.0.1.1 GATEWAY=10.0.1.1

BROADCAST=10.0.1.255 /# 设置物理网卡为混杂模式

ifdown $IFACE ifconfig $IFACE 0.0.0.0 promisc up

/# 创建网桥,并物理网卡加入网桥,同时设置网桥的 IP 为服务网络网段 brctl addbr $BRIDGE

brctl addif $BRIDGE $IFACE brctl stp $BRIDGE on

ifconfig $BRIDGE $SERVICE_IP netmask 255.255.255.0 broadcast $BROADCAST route add default gw $GATEWAY

/# 在网桥上设置多 IP,让它同时具有管理网段的 IP ifconfig ${BRIDGE}:0 $MANAGE_IP netmask 255.255.255.0 broadcast 172.16.99.255

注意,上述黑体的一句在 node2 中需要作相应修改,其余不变,如下: MANAGE_IP=172.16.99.109

VLAN

图 4 同样适用于 VLAN 网络,下面我们来实现它。在 node1 与 node2 上分别执行下述脚本: 清单 4. node1 与 node2 的 VLAN 配置脚本

MAC=c8:3a:35:d7:86:da

IP=10.0.1.1/24 ip link add link eth1 name eth1.1 type vlan id 1

ip link set eth1.1 up brctl addbr br1

brctl setfd br1 0 brctl stp br1 on

ip link set br1 address $MAC ip link set br1 up

brctl addif br1 eth1.1 ip addr add $IP dev br1

注意,上述黑体的一句在 node2 中需要作相应修改,其余不变,如下: MAC= c8:3a:35:d7:86:db

测试

我们采用 QEMU 创建虚拟机来进行测试,其中网络部分的配置为:

  

  

我们使用一个现成的镜像,下载地址: curl http://wiki.qemu.org/download/linux-0.2.img.bz2 -o /bak/kvmimages/linux-0.2.img

在 node1 与 node2 上分别用下列配置定义两个虚机,注意,下面打粗体的部分()在两个节点中请设置不一样的值。

cat /etc/libvirt/qemu/test.xml 清单 5. node1 与 node2 的虚机定义文件

VM1 393216 393216 1 hvm destroy restart destroy /usr/bin/qemu-system-i386

linux之cut用法

Posted on

linux之cut用法

cut是一个选取命令,就是将一段数据经过分析,取出我们想要的。一般来说,选取信息通常是针对“行”来进行分析的,并不是整篇信息分析的。

(1)其语法格式为: cut [-bn] [file] 或 cut [-c] [file] 或 cut [-df] [file]

使用说明 cut 命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段写至标准输出。 如果不指定 File 参数,cut 命令将读取标准输入。必须指定 -b、-c 或 -f 标志之一。

主要参数 -b :以字节为单位进行分割。这些字节位置将忽略多字节字符边界,除非也指定了 -n 标志。 -c :以字符为单位进行分割。 -d :自定义分隔符,默认为制表符。 -f :与-d一起使用,指定显示哪个区域。 -n :取消分割多字节字符。仅和 -b 标志一起使用。如果字符的最后一个字节落在由 -b 标志的 List 参数指示的
范围之内,该字符将被写出;否则,该字符将被排除。

(2)cut一般以什么为依据呢? 也就是说,我怎么告诉cut我想定位到的剪切内容呢?

cut命令主要是接受三个定位方法:

第一,字节(bytes),用选项-b

第二,字符(characters),用选项-c

第三,域(fields),用选项-f

(3)以“字节”定位

举个例子吧,当你执行ps命令时,会输出类似如下的内容:

[rocrocket@rocrocket programming]$ who rocrocket :0 2009-01-08 11:07 rocrocket pts/0 2009-01-08 11:23 (:0.0) rocrocket pts/1 2009-01-08 14:15 (:0.0) 如果我们想提取每一行的第3个字节,就这样:

[rocrocket@rocrocket programming]$ who|cut -b 3 c c c

(4) 如果“字节”定位中,我想提取第3,第4、第5和第8个字节,怎么办?

-b支持形如3-5的写法,而且多个定位之间用逗号隔开就成了。看看例子吧:

[rocrocket@rocrocket programming]$ who|cut -b 3-5,8 croe croe croe 但有一点要注意,cut命令如果使用了-b选项,那么执行此命令时,cut会先把-b后面所有的定位进行从小到大排序,然后再提取。可不能颠倒定位的顺序哦。这个例子就可以说明这个问题:

[rocrocket@rocrocket programming]$ who|cut -b 8,3-5 croe croe croe (5) 还有哪些类似“3-5”这样的小技巧,列举一下吧!

[rocrocket@rocrocket programming]$ who rocrocket :0 2009-01-08 11:07 rocrocket pts/0 2009-01-08 11:23 (:0.0) rocrocket pts/1 2009-01-08 14:15 (:0.0) [rocrocket@rocrocket programming]$ who|cut -b -3 roc roc roc [rocrocket@rocrocket programming]$ who|cut -b 3- crocket :0 2009-01-08 11:07 crocket pts/0 2009-01-08 11:23 (:0.0) crocket pts/1 2009-01-08 14:15 (:0.0) 想必你也看到了,-3表示从第一个字节到第三个字节,而3-表示从第三个字节到行尾。如果你细心,你可以看到这两种情况下,都包括了第三个字节“c”。 如果我执行who|cut -b -3,3-,你觉得会如何呢?答案是输出整行,不会出现连续两个重叠的c的。看:

[rocrocket@rocrocket programming]$ who|cut -b -3,3- rocrocket :0 2009-01-08 11:07 rocrocket pts/0 2009-01-08 11:23 (:0.0) rocrocket pts/1 2009-01-08 14:15 (:0.0) (6)给个以字符为定位标志的最简单的例子吧!

下面例子你似曾相识,提取第3,第4,第5和第8个字符:

[rocrocket@rocrocket programming]$ who|cut -c 3-5,8 croe croe croe 不过,看着怎么和-b没有什么区别啊?莫非-b和-c作用一样? 其实不然,看似相同,只是因为这个例子举的不好,who输出的都是单字节字符,所以用-b和-c没有区别,如果你提取中文,区别就看出来了,来,看看中文提取的情况:

[rocrocket@rocrocket programming]$ cat cut_ch.txt 星期一 星期二 星期三 星期四 [rocrocket@rocrocket programming]$ cut -b 3 cut_ch.txt � � � � [rocrocket@rocrocket programming]$ cut -c 3 cut_ch.txt 一 二 三 四 看到了吧,用-c则会以字符为单位,输出正常;而-b只会傻傻的以字节(8位二进制位)来计算,输出就是乱码。 既然提到了这个知识点,就再补充一句,如果你学有余力,就提高一下。 当遇到多字节字符时,可以使用-n选项,-n用于告诉cut不要将多字节字符拆开。例子如下:

[rocrocket@rocrocket programming]$ cat cut_ch.txt |cut -b 2 � � � � [rocrocket@rocrocket programming]$ cat cut_ch.txt |cut -nb 2 [rocrocket@rocrocket programming]$ cat cut_ch.txt |cut -nb 1,2,3 星 星 星 星 (7)域是怎么回事呢?解释解释:)

为什么会有“域”的提取呢,因为刚才提到的-b和-c只能在固定格式的文档中提取信息,而对于非固定格式的信息则束手无策。这时候“域”就派上用场了。如果你观察过/etc/passwd文件,你会发现,它并不像who的输出信息那样具有固定格式,而是比较零散的排放。但是,冒号在这个文件的每一行中都起到了非常重要的作用,冒号用来隔开每一个项。

我们很幸运,cut命令提供了这样的提取方式,具体的说就是设置“间隔符”,再设置“提取第几个域”,就OK了!

以/etc/passwd的前五行内容为例:

[rocrocket@rocrocket programming]$ cat /etc/passwd|head -n 5 root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin [rocrocket@rocrocket programming]$ cat /etc/passwd|head -n 5|cut -d : -f 1 root bin daemon adm lp 看到了吧,用-d来设置间隔符为冒号,然后用-f来设置我要取的是第一个域,再按回车,所有的用户名就都列出来了!呵呵 有成就感吧! 当然,在设定-f时,也可以使用例如3-5或者4-类似的格式:

[rocrocket@rocrocket programming]$ cat /etc/passwd|head -n 5|cut -d : -f 1,3-5 root:0:0:root bin:1:1:bin daemon:2:2:daemon adm:3:4:adm lp:4:7:lp [rocrocket@rocrocket programming]$ cat /etc/passwd|head -n 5|cut -d : -f 1,3-5,7 root:0:0:root:/bin/bash bin:1:1:bin:/sbin/nologin daemon:2:2:daemon:/sbin/nologin adm:3:4:adm:/sbin/nologin lp:4:7:lp:/sbin/nologin [rocrocket@rocrocket programming]$ cat /etc/passwd|head -n 5|cut -d : -f -2 root:x bin:x daemon:x adm:x lp:x (8)如果遇到空格和制表符时,怎么分辨呢?我觉得有点乱,怎么办?

有时候制表符确实很难辨认,有一个方法可以看出一段空格到底是由若干个空格组成的还是由一个制表符组成的。

[rocrocket@rocrocket programming]$ cat tab_space.txt this is tab finish. this is several space finish. [rocrocket@rocrocket programming]$ sed -n l tab_space.txt this is tab\tfinish.$ this is several space finish.$ 看到了吧,如果是制表符(TAB),那么会显示为\t符号,如果是空格,就会原样显示。 通过此方法即可以判断制表符和空格了。 注意,上面sed -n后面的字符是L的小写字母哦,不要看错。

(9)我应该在cut -d中用什么符号来设定制表符或空格呢?

其实cut的-d选项的默认间隔符就是制表符,所以当你就是要使用制表符的时候,完全就可以省略-d选项,而直接用-f来取域就可以了。

如果你设定一个空格为间隔符,那么就这样:

[rocrocket@rocrocket programming]$ cat tab_space.txt |cut -d ' ' -f 1 this this 注意,两个单引号之间可确实要有一个空格哦,不能偷懒。 而且,你只能在-d后面设置一个空格,可不许设置多个空格,因为cut只允许间隔符是一个字符。

[rocrocket@rocrocket programming]$ cat tab_space.txt |cut -d ' ' -f 1 cut: the delimiter must be a single character Try `cut --help' for more information.

(10)cut有哪些缺陷和不足?

猜出来了吧?对,就是在处理多空格时。 如果文件里面的某些域是由若干个空格来间隔的,那么用cut就有点麻烦了,因为cut只擅长处理“以一个字符间隔”的文本内容 来源: [http://www.cnblogs.com/dong008259/archive/2011/12/09/2282679.html](http://www.cnblogs.com/dong008259/archive/2011/12/09/2282679.html)