人人范文网 范文大全

linux 命令总结

发布时间:2020-03-02 12:47:37 来源:范文大全 收藏本文 下载本文 手机版

linux 命令总结

1、永久更改ip ifconfig eth0 新ip 然后编辑/etc/sysconfig/network-scripts/ifcfg-eth0,修改ip

2、从Linux上远程显示Windows桌面 安装rdesktop包

3、手动添加默认网关 以root用户,

执行: route add default gw 网关的IP 想更改网关

vi /etc/sysconfig/network-scripts/ifcfg-eth0 更改GATEWAY

/etc/init.d/network restart

4、查出22端口现在运行什么程序 lsof -i :22

5、查看本机的IP,gateway, dns IP: 以root用户登录,执行ifconfig。 其中eth0是第一块网卡,lo是默认的设备

Gateway: 以root用户登录,执行netstat -rn, 以0.0.0.0开头的一行的Gateway即为默认网关

也可以查看/etc/sysconfig/network文件,里面有指定的地址!

DNS: more /etc/reslov.conf,内容指定如下: nameserver 202.206.32.1 nameserver 202.206.32.1

6、RH8.0命令行下轻松改变ping 的TTL值 #sysctl -w net.ipv4.ip_default_ttl=N (N=0~255),若N>255,则ttl=0

7、RH8.0命令行下轻松改变系统配置默认值

编辑/etc/sysctl.conf, 例如,将 net.ipv4.ip_forward = 0 变为 net.ipv4.ip_forward = 1 重启后生效,用sysctl -a查看可知

8、mount局域网上其他windows机器共享出的目录

mount -t smbfs -o username=guest,paword=guest //machine/path /mnt/cdrom

9、允许|禁止root通过SSH登陆

修改hd_config:PermitRootLogin no|yes

10、让root直接telnet登陆

编辑/etc/pam.d/login,去掉 auth required /lib/security/pam_securetty.so 这句话

11、改变telnet的端口

/etc/services这个文件里可修改想要的端口号.重启守护进程

12、终端模式有问题 export TERM=vt100

13、模仿超级终端,LINUX里什么程序连接路由器和交换机(alstone) minicom

14、h上来能不能不自动断线

那是timetou的设置,修改TMOUT变量值

15、用什么工具做入侵检测

snort

16、Linux下检测程序内存泄漏的工具 cchecker或是efence库都可以

17、linux下如何监视所有通过本机网卡的数据 tcpdump iptraf

18、为什么root执行好多命令都说command not found 一定是telnet上来的,然后su成root的,修改su命令格式,应该是su更换你登入时所用的shell 语法

chsh [ -s shell ] [ -l ] [ -u ] [ -v ] [ username ] 描述

chsh 用来更换你登入时所用的shell 。在命令列没指定shell。 chsh 会提示一个给你。

有效的shell

chsh 可用指定路径全名的方式来指定任何一个可执行的档案。 然而,如果此 shell并没纪录在 /etc/shells 档上,则chsh会提出警告讯息。 选项

-s, --shell 变更你的登入shell. -l, --list-shells

列出纪录在 /etc/shells 的shell。

-u, --help 使用短讯。

-v, --version 版本资讯

相关文件

login(1) , pawd(5) , shells(5)

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 114 在linux下一些常用的关机/重启命令

有shutdown、halt、reboot、及init,它们都可以达到重启系统的目的,但每个命令的内部工作过程是不同的。

1.shutdown shutdown命令安全地将系统关机。 有些用户会使用直接断掉电源的方式来关闭linux,这是十分危险的。因为linux与windows不同,其后台运行着许多进程,所以强制关机可能会导致进程的数据丢失﹐使系统处于不稳定的状态﹐甚至在有的系统中会损坏硬件设备。

而在系统关机前使用shutdown命令﹐系统管理员会通知所有登录的用户系统将要关闭。并且login指令会被冻结﹐即新的用户不能再登录。直接关机或者延迟一定的时间才关机都是可能的﹐还可能重启。这是由所有进程〔proce〕都会收到系统所送达的信号〔signal〕决定的。这让像vi之类的程序有时间储存目前正在编辑的文档﹐而像处理邮件〔mail〕和新闻〔news〕的程序则可以正常地离开等等。 shutdown执行它的工作是送信号〔signal〕给init程序﹐要求它改变runlevel。Runlevel 0被用来停机〔halt〕﹐runlevel 6是用来重新激活〔reboot〕系统﹐而runlevel 1则是被用来让系统进入管理工作可以进行的状态﹔这是预设的﹐假定没有-h也没有-r参数给shutdown。要想了解在停机〔halt〕或者重新开机〔reboot〕过程中做了哪些动作﹐你可以在这个文件/etc/inittab里看到这些runlevels相关的资料。

shutdown 参数说明:

[-t] 在改变到其它runlevel之前﹐告诉init多久以后关机。

[-r] 重启计算器。

[-k] 并不真正关机﹐只是送警告信号给每位登录者〔login〕。

[-h] 关机后关闭电源〔halt〕。

[-n] 不用init﹐而是自己来关机。不鼓励使用这个选项﹐而且该选项所产生的后果往往不总是你所预期得到的。

[-c] cancel current proce取消目前正在执行的关机程序。所以这个选项当然没有时间参数﹐但是可以输入一个用来解释的讯息﹐而这信息将会送到每位使用者。

[-f] 在重启计算器〔reboot〕时忽略fsck。 [-F] 在重启计算器〔reboot〕时强迫fsck。

[-time] 设定关机〔shutdown〕前的时间。

2.halt----最简单的关机命令

其实halt就是调用shutdown -h。halt执行时﹐杀死应用进程﹐执行sync系统调用﹐文件系统写操作完成后就会停止内核。

参数说明:

[-n] 防止sync系统调用﹐它用在用fsck修补根分区之后﹐以阻止内核用老版本的超级块〔superblock〕覆盖修补过的超级块。

[-w] 并不是真正的重启或关机﹐只是写wtmp〔/var/log/wtmp〕纪录。

[-d] 不写wtmp纪录〔已包含在选项[-n]中〕。

[-f] 没有调用shutdown而强制关机或重启。

[-i] 关机〔或重启〕前﹐关掉所有的网络接口。

[-p] 该选项为缺省选项。就是关机时调用poweroff。

3.reboot reboot的工作过程差不多跟halt一样﹐不过它是引发主机重启﹐而halt是关机。它的参数与halt相差不多。

4.init init是所有进程的祖先﹐它的进程号始终为1﹐所以发送TERM信号给init会终止所有的用户进程﹑守护进程等。shutdown 就是使用这种机制。init定义了8个运行级别(runlevel),init 0为关机﹐init 1为重启。关于init可以长篇大论﹐这里就不再叙述。另外还有telinit命令可以改变init的运行级别﹐比如﹐telinit -iS可使系统进入单用户模式﹐并且得不到使用shutdown时的信息和等待时间。

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 115 Linux服务器的一些基本应用

现就以如下网络架构为例,来说一下linux服务器的配置。在正式配置之前先说一下这个服务器所要实现的功能: 1.数据共享 2.打印共享 3.模拟NT域 4.ADSL共享 5.内部DNS服务 6.DHCP服务 7.FTP服务 8.WWW服务 9.OPENSSH 10.磁盘配额 11.动态域名

网络架构配置如下: Network:10.10.0.0 Server IP:10.10.1.1 Server Subnet-mask:255.255.0.0 Client IP:10.10.1.10-10.10.1.100 Client Subnet-mask:255.255.0.0 Client getway:10.10.1.1 Client DNS:10.10.1.2,202.96.134.133

一、准备工作:

1.RedHat linux 7.2光盘一套

2.以太ADSL拔号器及您的ADSL接入帐号

3.两块网卡,最好是即插即用的,免跳线的请察明irq和io。 4.除本机以外的其它机器

二、RedHat linux 7.2安装:

1.初学者建议用图形界面,请用定制安装。 2系统分区如下(10G): swap:500M /:2G /var:1G /home:2G /tools:500M /data:4G 分区的合理化请参考网上相关文章。 3.若是即插用网卡,系统能检测到,请设置好ip地址,子网掩码等,请分别设为10.10.1.1和10.10.1.2,subnet-mask为255.255.0.0;若是免跳线网卡,那就等装好系统再设置。

4.软件包选择,要全选上也没关系,只要有空间,若是空间有限有话,不妨定制一下软件包,下面是我的选择,仅供参考: Printing Support Network Support Dialup Support SMB:windows file server WWW:web server DNS:DNS name server Software Development

5.现在就一路next安装下去,最后不要忘了做一张启动盘。

三、linux网络环境配置

[1]重启机器进入系统以后,去掉一些不必要的服务吧,留着它们启动速度慢,而且也不安全,下面是我机器刚安装好以后所保留的一些服务:

gpm/iptables/netfs/network/nfs/nfslock/portmap/syslog/xfs/xinetd 至其它的服务,等我们配置好再加载吧。 [2]安装linuxconf,配置网络。 放入光盘1 mount /dev/cdrom /mnt/cdrom cd /mnt/cdrom/RedHat/RPMS rpm –ivh linuxconf-1.25r7-3.i386.rpm

请用setup/system services或是chkconfig –levlel 3 linuxconf on将linuxconf设置为系统自启动服务。

netconf选择Host name and IP network devices进行主机名及网络设置: Host name + domain:cxserver ------第一张网卡---------- config mode:Manual primary name + domain:abc Ip addre:10.10.1.2 Netmask:255.255.0.0 Net device:eth0 Kernel Module:ne I/O port:0x300 Irq:3 ------第二张网卡---------- config mode:Manual primary name + domain:cxserver Ip addre:10.10.1.1 Netmask:255.255.0.0 Net device:eth0 Kernel Module:ne I/O port:0x320 Irq:5 选择Accept退出,重新启动就会看到eth0和eth1两网卡启动成功,进入系统后可用ifconfig命令查看状态,用ping命令测试其连通性,比如ping一部windows机器。

四、DNS服务器配置

为了让局域网内部用户访问服务器方便一点,配置一个DNS服务器是十分有必要的,毕竟一个名字总比一串数字好记,下面将服务器10.10.1.1配一个域名www.daodoc.com/distrib/sourc...pd-1.2.5.tar.gz 2]安装: tar zxvf proftpd-1.2.5.tar.gz cd proftpd-1.2.5 ./configure –prefix=/usr/local/proftpd //指定安装在/usr/local/proftpd目录下 make make install cp contrib/dist/rpm/proftpd.init.d /etc/rc.d/init.d/proftpd chmod 700 /etc/rc.d/init.d/proftpd chkconfig –level 3 proftpd on //设置为系统自启动服务

cp /usr/local/proftpd/sbin/proftpd /usr/sbin //将proftpd拷至/usr/sbin目录下,让系

统能自动搜索到,也免得再去加一个搜索路径 3]配置/usr/local/proftpd/etc/proftpd.conf文件: vi /usr/local/proftpd.conf ServerName \"Xchen FTP server\" //服务器登录提示 ServerType standalone DefaultServer on Port 21 Umask 022 MaxInstances 30 User nobody Group nobody //原来为nogroup,请改成nobody RequireValidShell off //手动添加此名,重要

//限定test组用户只能访问自己的home目录,而不能向上浏览 DefaultRoot ~ test //限定test组用户只能访问自己的/home/ftp目录,不能向上浏览 DefaultRoot ~/ftp test //限定music组用户只能访问/home/music目录,不能向上浏览 DefaultRoot /home/ftp music //除music组中bb用户外都能访问/home/music目录,不能向上浏览 DefaultRoot /home/ftp music,!bb //上面组需要自己建立:groupadd test,gpawd –a username test ServerIdent off //登录时不显示版本信息 AllowOverwrite on // /home/ftp为匿名用户登录目录 User ftp Group ftp UserAlias anonymous ftp MaxClients 10 DisplayLogin welcome.msg DisplayFirstChdir .meage DenyAll 4]启动服务:/etc/rc.d/init.d/proftpd start 5]测试,在客户端用FTP软件或命令行FTP程序进行访问ftp.cx.com。 6]proftpd还有很多高级应用,请参考相关资料,这里就不多赘述。

十、WWW服务

www服务用apache来实现,步骤极其简单,当然,这里说的是初级应用。因为我们要实现的是简单的www服务,所以只需更改下面几个参数即可: 1]Vi /etc/httpd/conf/httpd.conf ServerName www.daodoc.com提供的动态服务的实现。

1]登录www.daodoc.com网站,注册一个用户,并申请一个动态域名xxxx.3322.org。 2]下载linux客户端软件:

http://www.daodoc.com/dyndnspage/ez-i...-linux-i386.tgz 3]安装软件:

tar zxvf ez-ipupdate-3.0.10-linux-i386.tgz mv ez-ipupdate-3.0.10-linux-i386 /usr/local/ezip 4]编辑/usr/local/ezip/qdns.conf文件:

vi /usr/local/qdns.conf service-type=qdns user=username:paword //用户名及密码,用冒号隔开 host=xxxxx.3322.org //你申请的域名 interface=ppp0 //接口为ppp0 max-interval=2073600 cache-file=/tmp/ez-ipupdate.cache 5]将当前ip现新到我们申请的域名: cd /usr/local/ezip ez-ipupdate –c qdns.conf 系统会提示数据更新成功,好,我们来ping一下xxxx.3322.org,是ppp0的IP,再用http://xxx.3322.org试一下,成功!!!。

6]问题又来了,难道我们每次启动ADSL都要用手动更新一次吗,你可能会想到用crontab让它每隔几分钟更新一次,不过为了ip更新而启用crond服务似乎有点小题大做,我的方法,修改/usr/sbin/adsl-start脚本:

vi /usr/sbin/adsl-start 找到倒数25行‖tty –s && $ECHO ― Connected ! ―,在其下增加一行: /usr/local/ezip/ez-ipupdate –c /usr/local/ezip/qdns.conf 存盘退出,我们让ADSL拔号完成以后自动更新! 7]测试一下: adsl-start .Connected! ez-ipupdate Version 3.0.10 Copyright (C) 1999-2000 Angus Mackay.connected to members.3322.org (202.X.X.X) on port 80.request succeful OK,数据更新成功。

好,现在你随时随地都可以用xxxx.3322.org访问你的服务了,不错吧。 十

二、openh的设置

如果你在家里或者其它地方,怎样控制你的服务器,你可能会想到用telnet,本来是可以的,但是由于telnet用的是明码传输,容易给那些不怀好意者可乘之机,所以我们用openh来代替telnet。

1]卸载原来的2.9x版,2.9x版有bug,不安全: rpm –e openh 2]最新软件包下载:

ftp://ftp.openbsd.org/pub/OpenBSD/O...sh-3.4p1.tar.gz 3]安装软件:

tar zxvf openh-3.4p1.tar.gz cd openh-3.41 ./configure --prefix=/usr/local/h \\ --sysconfdir=/etc/h \\ --with-tcp-wrappers \\ --with-ipv4-default \\ --with-md5-pawords make

make install

注:安装完成以后,会自动生成主机密钥,还会提示需要hd用户帐号,可用useradd加一个hd用户。

install /contrib/redhat/hd.pam /etc/pam.d/hd cp contrib/redhat/hd.init /etc/rc.d/init.d/hd chkconfig --level 3 hd on ;配置成系统服务 4]配置openh之/etc/h/h_config文件 vi /etc/h/h_config Host * ForwardAgent no ForwardX11 no RhostsAuthentication no RhostsRSAAuthentication no RSAAuthentication yes

PawordAuthentication yes BatchMode no CheckHostIP yes

StrictHostKeyChecking ask IdentityFile ~/.h/identity Port 22 Cipher 3des

EscapeChar ~

5]配置openh之/etc/h/hd_config文件 vi /etc/h/hd_config Port 22 ListenAddre 0.0.0.0 ListenAddre :: HostKey /etc/h/h_host_key HostKey /etc/h/h_host_rsa_key HostKey /etc/h/h_host_dsa_key KeyRegenerationInterval 3600 ServerKeyBits 768

SyslogFacility AUTH LogLevel INFO

LoginGraceTime 600

#PermitRootLogin yes #还是不要让root直接登录为妙! StrictModes yes RSAAuthentication yes PubkeyAuthentication yes RhostsAuthentication no IgnoreRhosts yes RhostsRSAAuthentication no HostbasedAuthentication no IgnoreUserKnownHosts no PawordAuthentication yes PermitEmptyPawords no Subsystem sftp /usr/local/h/libexec/sftp-server 6]配置用户的加密密钥

useradd test pawd test su test h-keygen -d 出现提示请回车并输入pawd,再次输入pawd。

注:这个密码是系统加密运算时用到的,登录时还用原来密码。

7]启动服务

/etc/rc.d/init.d/hd start 8]在客户端用test帐号进行测试。

%%%%%%%%%%%%%%%%%%%%%%%%%%%%55 116 linux几条命令的基本用法

提示符为#表示需要root权限,$表示一般用户权限即可 1.linux下面命令行查找文件的两个方法

1) find $ find 路径 -name 待查找文件 -print -xdev参数把查询操作限制在当前的文件系统之中: $ find /mnt/dos -name *.sys -print -xdev 2) locate + updatedb: # updatedb $ locate 待查找文件

2.使用whatis和apropos命令获取命令简介 # makewhatis //更新whatis数据库 $ whatis w //查看命令w的功能

$ apropos search //查找有search功能的有哪些命令

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 117 在RedHat Linux环境中实现双网卡绑定

用于双网卡在同一网段内的情况,可以实现流量均衡或者备份 1.#cd /etc/sysconfig/network-scripts # cp ifcfg-eth0 ifcfg-bond0 -- 2 #vi ifcfg-bond0 将第一行改成 DEVICE=bond0 -- 3 # vi /etc/modules.conf 加入两行

alias bond0 bonding

options bond0 miimon=100 mode=1

-- 4 # vi /etc/rc.d/rc.local 加入两行

ifenslave bond0 eth0 eth1 route add -net 192.168.0.0 netmask 255.255.255.0 bond0 -- 5 reboot 重启会看见:

................

Bringing up interface bond0 OK Bringing up interface eth0 OK Bringing up interface bond1 OK -- 6.检查: #netstat -r 192.168.0.0 255.255.255.0 0 40 0 0 bond0 192.168.0.0 255.255.255.0 0 40 0 0 eth0 192.168.0.0 255.255.255.0 0 40 0 0 eth1 这时候看看你的网卡后面的灯, 他们闪的频率是一样的.. 当#ifdown eth0 时, 转换有5-6秒的延时.-- 注意:

如果网络不通需要从启bind # ifdown bind0

#ifup bind0

网卡绑定用在vncserver 或scp中就不灵了 118 route命令使用方法

route命令主要用于手动配置静态路由表 例:增加一条通过网关到达令一子网的路由

#route add net remote_net_ip gateway_ip 1

其中add代表要增加路由,net表示路由到达的是一个网络而不是一台主机,1代表远端网络需通过网关才能到达

(直接通过网络接口相连时,该参数用0) 命令格式:

#route add -net remote_net_ip gateway_ip -netmask netmask #route add -host host_ip local_interface_ip -interface

使用\"delete\",\"change\"命令参数可以对路由表中的路由信息进行删除和修改

使用\"netstat -rn\"命令查看当前的路由信息

过修改文件/etc/defaultrouter可以设置一些默认路由 $$$$$$$$$$$$$$$$$$$$$$$$$$$$ 122 find命令详细用法 名称 : find 用法 : find

使用说明 :

将文件系统内符合 expreion 的文件列出来。你可以指要文件的名称、类别、时间、大小、

权限等不同资讯的组合,只有完全相符的才会被列出来。

find 根据下列规则判断 path 和 expreion,在命令列上第一个] 范围 ;如[A-Z]即A,B,C一直到Z都符合要求 .所有的单个字符

* 所有字符,长度可以为0

3、举例

# ps -ef | grep in.telnetd

root 19955 181 0 13:43:53 ? 0:00 in.telnetd # more size.txt size文件的内容 b124230 b034325 a081016 m7187998 m7282064 a022021 a061048 m9324822 b103303 a013386 b044525 m8987131 B081016 M45678

B103303 BADc2345 # more size.txt | grep \'[a-b]\' 范围 ;如[A-Z]即A,B,C一直到Z都符合要求 b124230 b034325 a081016 a022021 a061048 b103303 a013386 b044525 # more size.txt | grep \'[a-b]\'* b124230 b034325 a081016 m7187998 m7282064 a022021 a061048 m9324822 b103303 a013386 b044525 m8987131 B081016 M45678

B103303 BADc2345 # more size.txt | grep \'\' 单个字符;如[A] 即A符合要求 b124230 b034325 b103303 b044525 # more size.txt | grep \'[bB]\' b124230 b034325 b103303 b044525 B081016 B103303 BADc2345 # grep \'root\' /etc/group root::0:root bin::2:root,bin,daemon sys::3:root,bin,sys,adm adm::4:root,adm,daemon uucp::5:root,uucp mail::6:root tty::7:root,tty,adm lp::8:root,lp,adm nuucp::9:root,nuucp daemon::12:root,daemon

# grep \'^root\' /etc/group 匹配正则表达式的开始行 root::0:root # grep \'uucp\' /etc/group uucp::5:root,uucp nuucp::9:root,nuucp # grep \'/tmp/sharetab.$$ [ \"x$fstype\" != xnfs ] && \\ echo \"$path\\t$res\\t$fstype\\t$opts\\t$desc\" \\ >>/tmp/sharetab.$$

/usr/bin/touch -r /etc/dfs/sharetab /tmp/sharetab.$$ /usr/bin/mv -f /tmp/sharetab.$$ /etc/dfs/sharetab if [ -f /etc/dfs/dfstab ] && /usr/bin/egrep -v \'^[ ]*(#|$)\' \\ if [ $startnfsd -eq 0 -a -f /etc/rmmount.conf ] && \\ if [ $startnfsd -ne 0 ]; then elif [ ! -n \"$_INIT_RUN_LEVEL\" ]; then while [ $wtime -gt 0 ]; do wtime=`expr $wtime - 1` if [ $wtime -eq 0 ]; then

echo \"Usage: $0 { start | stop }\" # more size.txt the test file their are files The end

# grep \'the\' size.txt the test file their are files # grep \'\\\' size.txt the test file

# grep \'\\\' size.txt the test file

# grep \'\\\' size.txt the test file The end 119 Emacs 安装 1.获得 Emacs

http://ftp.gnu.org/pub/gnu/emacs/ http://savannah.gnu.org/projects/emacs/ ftp://soft.eeatech.org:11021/incoming/other/ 2.安装方法

PATH=%emacs%/bin 3.基本配置

Emacs 的配置文件 .emacs or _emacs HOME=%path% 120 UNIX awk使用手册 什么是awk?

你可能对UNIX比较熟悉,但你可能对awk很陌生,这一点也不奇怪,的确,与其优秀的功能相比,awk还远没达到它应有的知名度。awk是什么?与其它大多数UNIX命令不同的是,从名字上看,我们不可能知道awk的功能:它既不是具有独立意义的英文单词,也不是几个相关单词的缩写。事实上,awk是三个人名的缩写,他们是:Aho、(Peter) Weinberg和(Brain)Kernighan。正是这三个人创造了awk---一个优秀的样式扫描与处理工具。

AWK的功能是什么?与sed和grep很相似,awk是一种样式扫描与处理工具。但其功能却大大强于sed和grep。awk提供了极其强大的功能:它几乎可以完成 grep和sed所能完成的全部工作,同时,它还可以可以进行样式装入、流控制、数学运算符、进程控制语句甚至于内置的变量和函数。它具备了一个完整的语言所应具有的几乎所有精美特性。实际上,awk的确拥有自己的语言:awk程序设计语言,awk的三位创建者已将它正式定义为:样式扫描和处理语言。

为什么使用awk?

使用awk的第一个理由是基于文本的样式扫描和处理是我们经常做的工作,awk所做的工作有些象数据库,但与数据库不同的是,它处理的是文本文件,这些文件没有专门的存储格式,普通的人们就能编辑、阅读、理解和处理它们。而数据库文件往往具有特殊的存储格式,这使得它们必须用数据库处理程序来处理它们。既然这种类似于数据库的处理工作我们经常会遇到,我们就应当找到处理它们的简便易行的方法,UNIX有很多这方面的工具,例如sed 、grep、sort以及find等等,awk是其中十分优秀的一种。

使用awk的第二个理由是awk是一个简单的工具,当然这是相对于其强大的功能来说的。的确,UNIX有许多优秀的工具,例如UNIX天然的开发工具C语言及其延续C++就非常的优秀。但相对于它们来说,awk完成同样的功能要方便和简捷得多。这首先是因为awk提供了适应多种需要的解决方案:从解决简单问题的awk命令行到复杂而精巧的awk程序设计语言,这样做的好处是,你可以不必用复杂的方法去解决本来很简单的问题。例如,你可以用一个命令行解决简单的问题,而C不行,即使一个再简单的程序,C语言也必须经过编写、编译的全过程。其次,awk本身是解释执行的,这就使得awk程序不必经过编译的过程,同时,这也使得它与shell script程序能够很好的契合。最后,awk本身较C语言简单,虽然awk吸收了C语言很多优秀的成分,熟悉C语言会对学习awk有很大的帮助,但 awk本身不须要会使用C语言——一种功能强大但需要大量时间学习才能掌握其技巧的开发工具。

使用awk的第三个理由是awk是一个容易获得的工具。与C和C++语言不同,awk只有一个文件(/bin/awk),而且几乎每个版本的UNIX都提供各自版本的awk,你完全不必费心去想如何获得awk。但C语言却不是这样,虽然C语言是UNIX天然的开发工具,但这个开发工具却是单独发行的,换言之,你必须为你的UNIX版本的C语言开发工具单独付费(当然使用D版者除外),获得并安装它,然后你才可以使用它。

基于以上理由,再加上awk强大的功能,我们有理由说,如果你要处理与文本样式扫描相关的工作,awk应该是你的第一选择。在这里有一个可遵循的一般原则:如果你用普通的shell工具或shell script有困难的话,试试awk,如果awk仍不能解决问题,则便用C语言,如果C语言仍然失败,则移至C++。

awk的调用方式

前面曾经说过,awk提供了适应多种需要的不同解决方案,它们是:

一、awk命令行,你可以象使用普通UNIX命令一样使用awk,在命令行中你也可以使用awk程序设计语言,虽然awk支持多行的录入,但是录入长长的命令行并保证其正确无误却是一件令人头疼的事,因此,这种方法一般只用于解决简单的问题。当然,你也可以在shell script程序中引用awk命令行甚至awk程序脚本。

二、使用-f选项调用awk程序。awk允许将一段awk程序写入一个文本文件,然后在awk命令行中用-f选项调用并执行这段程序。具体的方法我们将在后面的awk语法中讲到。

三、利用命令解释器调用awk程序:利用UNIX支持的命令解释器功能,我们可以将一段awk程序写入文本文件,然后在它的第一行加上: #!/bin/awk -f

并赋予这个文本文件以执行的权限。这样做之后,你就可以在命令行中用类似于下面这样的方式调用并执行这段awk程序了。

awk脚本文本名 待处理文件

awk的语法:

与其它UNIX命令一样,awk拥有自己的语法:

awk [ -F re] [parameter...] [\'prog\'] [-f progfile][in_file...] 参数说明:

-F re:允许awk更改其字段分隔符。

parameter: 该参数帮助为不同的变量赋值。

\'prog\': awk的程序语句段。这个语句段必须用单拓号:\'和\'括起,以防被shell解释。这个程序语句段的标准形式为:

\'pattern {action}\' 其中pattern参数可以是egrep正则表达式中的任何一个,它可以使用语法/re/再加上一些样式匹配技巧构成。与sed类似,你也可以使用\",\"分开两样式以选择某个范围。关于匹配的细节,你可以参考附录,如果仍不懂的话,找本UNIX书学学grep和sed(本人是在学习ed时掌握匹配技术的)。 action参数总是被大括号包围,它由一系统awk语句组成,各语句之间用\";\"分隔。awk解释它们,并在pattern给定的样式匹配的记录上执行其操作。与shell类似,你也可以使用―#‖作为注释符,它使―#‖到行尾的内容成为注释,在解释执行时,它们将被忽略。你可以省略pattern和 action之一,但不能两者同时省略,当省略pattern时没有样式匹配,表示对所有行(记录)均执行操作,省略action时执行缺省的操作——在标准输出上显示。

-f progfile:允许awk调用并执行progfile指定有程序文件。progfile是一个文本文件,他必须符合awk的语法。

in_file:awk的输入文件,awk允许对多个输入文件进行处理。值得注意的是awk不修改输入文件。如果未指定输入文件,awk将接受标准输入,并将结果显示在标准输出上。awk支持输入输出重定向。

awk的记录、字段与内置变量:

前面说过,awk处理的工作与数据库的处理方式有相同之处,其相同处之一就是awk支持对记录和字段的处理,其中对字段的处理是grep和sed不能实现的,这也是awk优于二者的原因之一。在awk中,缺省的情况下总是将文本文件中的一行视为一个记录,而将一行中的某一部分作为记录中的一个字段。为了操作这些不同的字段,awk借用shell的方法,用1,2,3...这样的方式来顺序地表示行(记录)中的不同字段。特殊地,awk用0表示整个行(记录)。不同的字段之间是用称作分隔符的字符分隔开的。系统默认的分隔符是空格。awk允许在命令行中用-F re的形式来改变这个分隔符。事实上,awk用一个内置的变量FS来记忆这个分隔符。awk中有好几个这样的内置变量,例如,记录分隔符变量RS、当前工作的记录数NR等等,本文后面的附表列出了全部的内置变量。这些内置的变量可以在awk程序中引用或修改,例如,你可以利用NR变量在模式匹配中指定工作范围,也可以通过修改记录分隔符RS让一个特殊字符而不是换行符作为记录的分隔符。

例:显示文本文件myfile中第七行到第十五行中以字符%分隔的第一字段,第三字段和第七字段:

awk -F % \'NR==7,NR==15 {printf 1 3 7}\' awk的内置函数

awk 之所以成为一种优秀的程序设计语言的原因之一是它吸收了某些优秀的程序设计语言(例如C)语言的许多优点。这些优点之一就是内置函数的使用,awk定义并支持了一系列的内置函数,由于这些函数的使用,使得awk提供的功能更为完善和强大,例如,awk使用了一系列的字符串处理内置函数(这些函数看起来与C 语言的字符串处理函数相似,其使用方式与C语言中的函数也相差无几),正是由于这些内置函数的使用,使awk处理字符串的功能更加强大。本文后面的附录中列有一般的awk所提供的内置函数,这些内置函数也许与你的awk版本有些出入,因此,在使用之前,最好参考一下你的系统中的联机帮助。

作为内置函数的一个例子,我们将在这里介绍awk的printf函数,这个函数使得awk与c语言的输出相一致。实际上,awk中有许多引用形式都是从C语言借用过来的。如果你熟悉C语言,你也许会记得其中的printf函数,它提供的强大格式输出功能曾经带我们许多的方便。幸运的是,我们在awk中又和它重逢了。awk中printf几乎与C语言中一模一样,如果你熟悉C语言的话,你完全可以照C语言的模式使用awk中的printf。因此在这里,我们只给出一个例子,如果你不熟悉的话,请随便找一本C语言的入门书翻翻。 例:显示文件myfile中的行号和第3字段:

awk \'{printf\"%03d%s\\n\",NR,1}\' myfile 在命令行使用awk

按照顺序,我们应当讲解awk程序设计的内容了,但在讲解之前,我们将用一些例子来对前面的知识进行回顾,这些例子都是在命令行中使用的,由此我们可以知道在命令行中使用awk是多么的方便。这样做的原因一方面是为下面的内容作铺垫,另一方面是介绍一些解决简单问题的方法,我们完全没有必要用复杂的方法来解决简单的问题----既然awk提供了较为简单的方法的话。

例:显示文本文件mydoc匹配(含有)字符串\"sun\"的所有行。

awk \'/sun/{print}\' mydoc

由于显示整个记录(全行)是awk的缺省动作,因此可以省略action项。

awk \'/sun/\' mydoc

例:下面是一个较为复杂的匹配的示例:

awk \'/[Ss]un/,/[Mm]oon/ {print}\' myfile

它将显示第一个匹配Sun或sun的行与第一个匹配Moon或moon的行之间的行,并显示到标准输出上。

例:下面的示例显示了内置变量和内置函数length()的使用:

awk \'length(0)>80 {print NR}\' myfile

该命令行将显示文本myfile中所有超过80个字符的行号,在这里,用0表示整个记录(行),同时,内置变量NR不使用标志符\'\'。

例:作为一个较为实际的例子,我们假设要对UNIX中的用户进行安全性检查,方法是考察/etc下的pawd文件,检查其中的pawd字段(第二字段)是否为\"*\",如不为\"*\",则表示该用户没有设置密码,显示出这些用户名(第一字段)。我们可以用如下语句实现:

#awk -F: \'2==\"\" {printf(\"%s no paword!\\n\",1\' /etc/pawd 在这个示例中,pawd文件的字段分隔符是―:‖,因此,必须用-F:来更改默认的字段分隔符,这个示例中也涉及到了内置函数printf的使用。

awk的变量

如同其它程序设计语言一样,awk允许在程序语言中设置变量,事实上,提供变量的功能是程序设计语言的其本要求,不提供变量的程序设计语言本人还从未见过。

awk 提供两种变量,一种是awk内置的变量,这前面我们已经讲过,需要着重指出的是,与后面提到的其它变量不同的是,在awk程序中引用内置变量不需要使用标志符\"\"(回忆一下前面讲过的NR的使用)。awk提供的另一种变量是自定义变量。awk允许用户在awk程序语句中定义并调用自已的变量。当然这种变量不能与内置变量及其它awk保留字相同,在awk中引用自定义变量必须在它前面加上标志符\"\"。与C语言不同的是,awk中不需要对变量进行初始化, awk根据其在awk中第一次出现的形式和上下文确定其具体的数据类型。当变量类型不确定时,awk默认其为字符串类型。这里有一个技巧:如果你要让你的 awk程序知道你所使用的变量的明确类型,你应当在在程序中给它赋初值。在后面的实例中,我们将用到这一技巧。

运算与判断:

作为一种程序设计语言所应具有的特点之一,awk支持多种运算,这些运算与C语言提供的几本相同:如+、-、*、/、%等等,同时,awk也支持C语言中类似++、--、+=、-=、=+、=-之类的功能,这给熟悉C语言的使用者编写awk程序带来了极大的方便。作为对运算功能的一种扩展,awk还提供了一系列内置的运算函数(如log、sqr、cos、sin等等)和一些用于对字符串进行操作(运算)的函数(如length、substr等等)。这些函数的引用大大的提高了awk的运算功能。

作为对条件转移指令的一部分,关系判断是每种程序设计语言都具备的功能,awk也不例外。awk 中允许进行多种测试,如常用的==(等于)、!=(不等于)、>(大于)、=(大于等于)、>=(小于等于)等等,同时,作为样式匹配,还提供了~(匹配于)和!~(不匹配于)判断。

作为对测试的一种扩充,awk也支持用逻辑运算符:!(非)、&&(与)、||(或)和括号()进行多重判断,这大大增强了awk的功能。本文的附录中列出了awk所允许的运算、判断以及操作符的优先级。

awk的流程控制

流程控制语句是任何程序设计语言都不能缺少的部分。任何好的语言都有一些执行流程控制的语句。awk提供的完备的流程控制语句类似于C语言,这给我们编程带来了极大的方便。

1、BEGIN和END:

在awk 中两个特别的表达式,BEGIN和END,这两者都可用于pattern中(参考前面的awk语法),提供BEGIN和END的作用是给程序赋予初始状态和在程序结束之后执行一些扫尾的工作。任何在BEGIN之后列出的操作(在{}内)将在awk开始扫描输入之前执行,而END之后列出的操作将在扫描完全部的输入之后执行。因此,通常使用BEGIN来显示变量和预置(初始化)变量,使用END来输出最终结果。

例:累计销售文件xs中的销售金额(假设销售金额在记录的第三字段):

awk

>\'BEGIN { FS=\":\";print \"统计销售金额\";total=0} >{print 3;total=total+3;}

>END {printf \"销售金额总计:%.2f\",total}\' sx (注:>是shell提供的第二提示符,如要在shell程序awk语句和awk语言中换行,则需在行尾加反斜杠\\)

在这里,BEGIN预置了内部变量FS(字段分隔符)和自定义变量total,同时在扫描之前显示出输出行头。而END则在扫描完成后打印出总合计。

2、流程控制语句

awk提供了完备的流程控制语句,其用法与C语言类似。下面我们一一加以说明:

2.1、if...else语句: 格式:

if(表达式) 语句1 else 语句2 格式中\"语句1\"可以是多个语句,如果你为了方便awk判断也方便你自已阅读,你最好将多个语句用{}括起来。awk分枝结构允许嵌套,其格式为:

if(表达式1)

{if(表达式2)

语句1 else 语句2 }

语句3 else {if(表达式3) 语句4 else 语句5 }

语句6 当然实际操作过程中你可能不会用到如此复杂的分枝结构,这里只是为了给出其样式罢了。

2.2、while语句

格式为:

while(表达式) 语句

2.3、do-while语句

格式为:

do { 语句

}while(条件判断语句)

2.4、for语句

格式为:

for(初始表达式;终止条件;步长表达式)

{语句}

在awk 的 while、do-while和for语句中允许使用break,continue语句来控制流程走向,也允许使用exit这样的语句来退出。break 中断当前正在执行的循环并跳到循环外执行下一条语句。continue从当前位置跳到循环开始处执行。对于exit的执行有两种情况:当exit语句不在 END中时,任何操作中的exit命令表现得如同到了文件尾,所有模式或操作执行将停止,END模式中的操作被执行。而出现在END中的exit将导致程序终止。 例:为了

awk中的自定义函数

定义和调用用户自己的函数是几乎每个高级语言都具有的功能,awk也不例外,但原始的awk并不提供函数功能,只有在nawk或较新的awk版本中才可以增加函数。

函数的使用包含两部分:函数的定义与函数调用。其中函数定义又包括要执行的代码(函数本身)和从主程序代码传递到该函数的临时调用。

嵌入式linu学习心得

Linux命令总结

Ping命令总结

stata命令总结

stata命令总结

AutoCAD命令总结

命令

数据库操作命令总结

网络命令应用总结

cad命令+excel总结

linux 命令总结
《linux 命令总结.doc》
将本文的Word文档下载到电脑,方便编辑。
推荐度:
点击下载文档
点击下载本文文档