linux命令:基础

来源:互联网 发布:飞机模型制造软件 编辑:程序博客网 时间:2024/04/29 06:54

 

工作中用到的一些基础命令

 

Author:madding.lip

data:2010.12.19

 

引言:

本文介绍的内容比较易懂,并结合工作中常遇到的问题提出一些解决方法。限于篇幅,本文只阐述其中一种或几种方法。条条大路通罗马,如有兴趣可线下交流。具体的shell以附件形式提供,非常简单

 

目的:

本文主要以解决实际问题为出发点书写

 

场景:

你在查看线上日志或者数据订正时是否遇到过以下场景:

1.pd提了个需求,说要把1000个会员的mobileno删除掉,提供的是1000个会员的会员id

2.自己要写个简单的shell统计一些目前线上的日志情况,比如apache中百度爬虫一天的访问量

3.需要把两个文件合并成一个文件,比如第一个文件是会员id和邮箱id,第二个文件是会员id和密码id,要获取到密码id和邮箱id的对应关系

如果有类似疑问,本文可能比较适合你阅读,废话少说,开始介绍

 

 

基础:

1.语言类型:shell是解释型语言

2.处理对象:文件与目录

3.优点:简单、可移植、易开发

4.缺点:效率不高、数值处理差

5.基本格式:(说明:为了可移植性,第一行长度尽量限制在64Byte内,包括空格)

#!/bin/bash

…...

#define constants

…......

#checkinput paremeters

….....

#deal

...

exit$EXIT_CODE

 

6.基本命令分类:内建命令、函数、外部命令

7.常用命令:这个需要积累,以后有空会对每一块作单独分享,任何语言本身都不难,难得是基于一堆现有的东西进行筛选,开发,扩展。shell本身的语法是非常简单,但是要把awksedgrep等工具用好需要长期积累,本文只罗列可能用的命令的基本使用。

 

 

命令:

 

1.输出:

echo:显示输出,并且默认换行,加个-n就默认不换行。

这个主要用在调试代码或者提示脚本使用时比较常用。

 

举例1:你需要判断一个脚本的输入参数是否为两个,不是则提示用法并退出

if [ $# -ne "2"]

then

echo "Usage:`basename $0` filename update"

exit $E_BADARGS

fi

 

举例2:提示脚本不能使用root权限运行,线上脚本都是不允许这么作的,写法也是比较简单的。

ROOT_UID=0

if [ "$UID"-ne "$ROOT_UID" ]

then

echo "Mustbe root to run this script."

exit $E_NOTROOT

fi

 

echo的输出比较单调,学过c的话可以使用printf,语法和c一致

 

 

2.输入:

文件输入:<file

输入命令的输出结果:|

控制台输入:read< /dev/tty

 

输入一般用在交互比较多的地方,其他一般采用参数来传递内容。

目前线上用的比较少,一般线上的脚本不需要动态交互,我举个使用场景,主要是在执行时输入密码,一般用在管理机器上面

 

举例3:运行过程中控制台输入密码

echo -n "pleaseinput your password: "

while [ -z $pass]; do

stty -echo

read pass </dev/tty

stty echo

if [ -z $pass];then

echo ""

echo -n"please input your password: "

fi

done

 

echo ""

echo "youinput password: $pass"

 

3.查找

文件查找:findfind命令查找的方法很多,可以按文件名,文件类型,accesstimemodifytime查找,由于线上查找一般是admin查找,所以当查找一些没有权限的目录时会抛出一堆异常信息,可以在find命令后面加2>/dev/null即可过滤掉

 

举例4:大部分人都知道linux里面有个ifconfig,可是如果你到线上却找不到对应的命令,如果你对linux比较模型可能不知道目录分布规律,所以这时可能会用查找命令。

Find / -name ifconfig

不过find命令更多的是结合其他命令一起使用,find主要用来获取具体的文件路径,传递给其他命令使用

文本查找:grep

grep的扩展和用法都非常多,包括正则表达式等,grep命令有egrepfgrep等也可以用grep-e等带参数形式替代。

 

举例5:查看目前线上是否有个脚本在运行,比如脚本关键字是UpdateOfferSearchRecommend

ps aux | grepUpdateOfferSearchRecommend | grep -v grep

命令首先获取目前运行的所有帐号下的所有进程,第一个grep匹配出含有关键字的进程,第二个匹配出含有grep的进程,因为grep命令在运行时也是个进程,相当于过滤grep进程

 

举例6查看某个目录(包含子目录)下的文件包含特征字符串的信息,特征字符串127.0.0.1},这个在线上查找或统计某些错误时使用的比较多

find. -name filename |xargsgrep{127.0.0.1}

 

变化一下,查找目前工程中有哪些子工程中引入了某个jar。由于查找的信息一般是查看上下2行信息,以便查看版本和groupdId

find . -namepom.xml | xargs grep -n2 "toolkit.common.logging"

 

4.替换

替换是经常作的事,场景1描述的就是一种需求,让我们来把场景1细化。

 

举例71000个会员id的文件名为member_id.txt,这个换行符一般是windows下的格式

要改成以下命令格式:update member set mobile_no=null where member_id='xxx'

那么该怎么处理呢

书写sed脚本:

s//r//g

s/^/update/ member/ set/ mobile_no=null/ where/ member_id=/'/g

s/$//';/g

 

在通过sed脚本把sed命令引入即可:

sed -fmember_id.sed member_id.txt > member_id.result

 

来解释一下脚本做了哪些事情:

第一行把所以windows中的^M,即换行符替换为linux下面的格式

第二行把开通的内容替换为update member set mobile_no=null wheremember_id=',由于空格和‘号是特殊字符,因此需要转义

第三行把行尾替换为';,

最后通过外部文件把组装好的内容重定向到另一个文件。注意不能重定向到原来文件,要不然内容全部为空,可以想想为什么:)

 

5.排版

排版是目前最常用的脚本之一,主要是用来处理日志内容和文件处理

 

举例8:用空格分割获取线上第六行和第八行的数据,分别是对应的member_id和对应执行sql的毫秒数,主要统计线上某个member_id对应执行的sql的时间。

Awk -f ' ''{print $6 “ ” $8}' filename

 

 

以上是文本处理比较常用的内容,还有一些比较实用的命令比如:

 

1.查看服务器版本:lsb_release-a

2.查看内核版本:uname-runame-a则更详细

3.查看网络信息:/sbin/ifconfig,服务器上一般不把这个目录加到path中,主要是为了安全,可以想想看如果加了为什么会不安全

4.查看某个端口被哪个进程占用:netstat -anp | grep 8081或者lsof-i:8081,会看到进程,然后想看详细信息就查进程吧:)

5.linux下不同进制转换:echo 'ibase=10;obase=2;225'|bc10进制的225转成二进制,主要用来把membermultisignoffersign转成二进制查看,需要注意的是在将16进制转成10进制时可用以下方式表达echo 'ibase=16;obase=A;AAA' | bc或者echo 'ibase=16;obase=1010;AAA' | bc

6.获取javathread dump信息:kill-3 pid

7.登录某台机器执行脚本后退出并显示结果:线上的预发布机器就是跳板机因此可以不用输入密码就能登录服务器,可以书写如下:ssh-q server-web2201 grep ERROR~/output/log/sys/webx.log

8.把一个文件拷贝到另一个服务器:scp filenameusername@username'sip回车后输入密码

9.查看内核支持的位数:getconf LONG_BITunamea

10.查看cpu的位数:grepflags /proc/cpuinfo,lm64; pm 32; rm 16

 

谢谢

 

 

 

 

 

 

 

 

 

 

 

 

 

原创粉丝点击