grep abc *.pc 文件内容中查找 abc

grep –c abc *.txt 查找内容 abc ,并统计

grep –i abc *.txt 查找内容 abc ,大小写不敏感

set|grep TL_ABC 在环境变量中过滤 TL_ABC

diff abc.txt /usera/def.txt 比较文件

find . –name “abc*” 目录中查找文件

cp –p abc.txt /mydir/abc_d.txt 拷贝

ps –ef|grep UserA 列出某用户的进程

shellABC.sh > abc.log 覆盖输出

shellABC.sh >> abc.log 追加输出

exit 退出

su –userABC 切换用户

last 查看最近登录的用户

Esc+K 重复上次输入的命令 ( 多次 k 向上翻 )

编辑上次的命令: Esc+i 插入 Esc+x 删除 h 向左 l 向右

ipcs –oq|grep 5000 查看消息队列

make 自动查找目录下的 makefile 并编译

man sighold 查看该函数定义 man socket

cat abc.txt 查看文件

more abc.txt 分页查看文件

vi abc.txt 编辑文件

netstat –i 查看网卡

netstat –r 查看路由

alias pss=’ps –ef|grep abc’ 设置快捷 shell pss ,常用在 .profile

which pss ,或 which cc cc 所在的目录

PS1=’$PWD>’;export PS1 显示当前目录,而不是 $ ( 常用在 .profile )

set –o vi 常用在 Esc 显示 ^K 的情况下

cp /dev/null abc.log 清空文件 ( 大文件常常 vi 打不开 (:%d) ,直接用此命令 )

. .profile 修改 $HOME .profile 文件后不用重新登陆,用此命令立刻生效

set|grep ABC, 查看环境变量,或用 env

who|wc –l 统计在线人数

pwd 查看当前目录

ipcs –oq 查看消息队列是否拥堵

tail –f abc.log 跟踪文件末尾

chmod +x find_me.sh 加执行权限

netstat –an|grep 52 查看包含 52 的端口网络状态

netstat –an|grep LISTEN 查看侦听端口网络状态

ls –l|grep ‘^d’ 列出目录

ls –l|grep ‘^[^d]’ 列出非目录

grep userABC /etc/services 查看 DB2 端口等信息

grep userABC /etc/passwd 查看 $HOME 所在目录

dbx –a 99878 调试 attach PID( 有关 dbx 调试命令见其他 )

Shell进阶 命令


sudo !!                    以 root 的身份执行上一条命令
ctrl r                       在命令历史中查找
history                     查看命令历史
!88                          运行命令历史中的编号为88的命令
^old^new               替换前一条命令里的部分字符串并重新执行上一条命令
du -s * | sort -n -r    当前目录里的文件和文件夹按大小排序排列
> file.txt                  创建一个空文件,比 touch 短
top -p pid                监控某个进程的CPU和内存消耗情况,ps aux获得PID,或者 ps -p pid -o %cpu,%mem,cmd
netstat -tulpn           显示侦听的端口
netstat -anop           显示侦听的端口和侦听在这个端口号的进程
tail -f /path/to/file.log sed '/^Finished: SUCCESS$/ q' 当 file.log 里出现 Finished: SUCCESS 时候就退出 tail,这个命令用于实时监控并过滤 log 是否出现了某条记录。
ssh user@server bash < /path/to/local/script.sh 在远程机器上运行一段脚本。这条命令最大的好处就是不用把脚本拷到远程机器上。
lsof –i                     实时查看本机网络服务的活动状态。


脚本例子: ( 打印环境变量 )

env>env.log

while read line

var=’echo $line|awk –F=’{print $1}’’

value=’echo $line|awk –F=’{print $2}’’

echo $var “------”$value

done<env.log

rm –f env.log

脚本例子: ( 停止进程 , 带一个参数,用法 ShellName.sh DEF)

for i in ‘ps –ef|grep ABC|grep $1|awk ‘{print $2}’’

echo “delete PID $i”

kill -9 $i

Vi 命令

:wq 保存退出 :q! 强制退出

Kjhl 上下左右

i 进入插入模式, r 进入替代模式

A 到行尾并 Append

a 进入 Append 输入模式

O 在本行上新增一行

o 在本行下新增一行

:%d 删除所有文本

:sh 执行外部 shell

:389 跳到 389 , :1 跳至文件头 shift+g ,跳至页尾

:set nu 打印行号

Ctrl+f 向下翻页 , Ctrl+b 向上翻页

^ 移动至行首 $ 移动至行末

/ 向下查找, ? 向上查找 ( 继续按则查找下一个 )

// 重复上次查找

Esc 退出编辑或插入模式

X 删除后一个, x 删除前一个

:1,%s/abc/def/g 替换 abc def

:1,$s/^M//g ( 转换控制字符 ^M, Ctrl+V, Ctrl+M 输入 )

dd 删除一行

J 删除一行带回车

Yy 复制一行, p 粘贴

Shell Sed 常用用法

-----------------------------------------------------------------------------

文件 abc

TL_FMT_CHG_SHM_KEY=7100;export TL_FMT_CHG_SHM_KEY

TL_MSQ_SHM_KEY=7200;export TL_MSQ_SHM_KEY

TL_TXN_SRV_SHM_KEY=7300;export TL_TXN_SRV_SHM_KEY

需要取出等号前面的: awk -F= '{print $1}' abc

需要取出 TL_FMT_CHG_SHM_KEY 等号后面的 7100 这个值: ( 原理是取出等号和分号之间的数据 )

awk -F\; '{print $1}' abc|grep TL_FMT_CHG_SHM_KEY|awk -F= '{print $2}'

------------------------------------------------------------

$ a=5; b=7; c=2

$ echo $(( a+b*c ))

$ echo $(( (a+b)/c ))

$ echo $(( (a*b)%c))

a=5; ((a++)) 可將 $a 重定義為 6

a=5; ((a--)) 則為 a=4

a=5; b=7; ((a < b)) 會得到 0 (true) 的返回值。

常見的用於 (( )) 的測試符號有如下這些:

<= :小於或等於

>= :大於或等於

== :等於

!= :不等於

2.() 的用法

$(command)

/home/user2

$ curdir=$(pwd)

$ echo $curdir

/home/user2

$ cd /tmp

$ pwd

$ cd $curdir

$ pwd

/home/user2

以下的赋值语句:

$ curdir=$(pwd) $ curdir=`pwd`

pwd 的输出被赋给变量 curdir

使用 - n 参数显示实际在哪一行:

[sam@chenwy sam]$ grep -n '^$' myfile

if [ "`/usr/ucb/whoami`" != "root" ]; then

echo "You must be root to run this script!"

exit 1

if [ "${msg}" = "" ] ;then

echo "msg is null"

shell Awk & Sed 正则表达式 强文 :

___________________________________

1 >>inputfile

2 i=`cat inputfile|sed ...`

3 if [ $i =2 ]

4 rm -f inputfile

___________________________________

\ 屏蔽特殊字符

^ 匹配开始位置。

$ 匹配结束位置。

* 匹配前面的子表达式零次或多次。

. 匹配一个位置(例如 .$ 表示最后一个字符)

+ 匹配前面的子表达式一次或多次。

? 匹配前面的子表达式零次或一次。

{n} n 是一个非负整数。匹配确定的 n 次。

{n,} n 是一个非负整数。至少匹配 n 次。

{n,m} m n 均为非负整数,其中 n <= m 。最少匹配 n 次且最多匹配 m 次。

[xyz] 匹配所包含的任意一个字符。

[^xyz] 匹配未包含的任意字符。例如, '[^abc]' 可以匹配 "plain" 中的 'p'

[a-z] 匹配指定范围内的任意字符。例如, '[a-z]' 可以匹配 'a' 'z' 范围内的任意小写字母字符。

[^a-z] 匹配任何不在指定范围内的任意字符。例如, '[^a-z]' 可以匹配任何不在 'a' 'z' 范围内的任意字符。

[^$] 对空行

[^.*$] 对匹配行中任意字符串

^......$ 对包括 6 个字符的行

^.$ 对仅有一个字符的行

^\.[0-9][0-9] 对以一个句点和两个数字开始的行

[a-zA-Z] 对任意单字符

[0-9]\{2\}-[0-9]\{2\}-[0-9]\{4\} 对日期格式 dd-mm-yyyy

[0-9]\{3\}\.[0-9]\{3\}\.[0-9]\{3\}\.[0-9]\{3\} IP 地址格式 nnn.nnn.nnn.nnn

\d 匹配一个数字字符。等价于 [0-9]

\D 匹配一个非数字字符。等价于 [^0-9]

\f 匹配一个换页符。等价于 \x0c \cL

\n 匹配一个换行符。等价于 \x0a \cJ

\r 匹配一个回车符。等价于 \x0d \cM

\s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]

\S 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]

\t 匹配一个制表符。等价于 \x09 \cI

\v 匹配一个垂直制表符。等价于 \x0b \cK

\w 匹配包括下划线的任何单词字符。等价于 '[A-Za-z0-9_]'

\W 匹配任何非单词字符。等价于 '[^A-Za-z0-9_]'

Example: 列出文件的 1-4 ;

$cat ifile|sed -n '1,4p' # method 1

$sed -n '1,4p' ifile # method 2

$sed '8,12!d' ifile # method 3

$cat ifile|sed -n '1,4p;40p;45,50p' ( 列出文件的 1-4 ,40,45-50 ;)

Example: 列出包含 sf56 的行 ;

$cat ifile|sed -n '/sf56/p'

Example: 列出包含 sf|56 的行 (| 不是转义字符 );

$cat ifile|sed -n '/sf56/p'

Example: 列出以 1. 开头的行 (. 为转义字符 );

$cat inputfile|sed -n '/^1\./p'

Example: 列出以 1. 开头的行 (. 为转义字符 ), 且删除该行的最后一个字符 ;

$cat ifile|sed -n '/^1\./p'|sed 's/.$//'

Example: 列出删除 1-3 行后的所有行 ;

$cat ifile|sed '1,3d'

Example: 列出删除第一行的文件;

$cat ifile|sed '$d'

Example: 列出删除最后两行的文件;

$cat ifile|sed 'N;$!P;$!D;$d'

Example: 列出删除最后 10 行的文件;

$cat ifile|sed -e :a -e '$d;N;2,10ba' -e 'P;D' # method 1

$cat ifile|sed -n -e :a -e '1,10!{P;N;D;};N;ba' # method 2

Example: 列出删除第 3 行到最后一行的文件;

$cat ifile|sed '3,$d'

Example: 删除每行开头的空格或 tab 符号;

$cat inputfile|sed 's/^[ \t]*//' # see note on '\t' at end of file

Example: 删除每行末尾的空格或 tab 符号;

$cat inputfile|sed 's/[ \t]*$//' # see note on '\t' at end of file

Example: 删除每行开头和末尾的空格或 tab 符号;

$cat inputfile|sed 's/^[ \t]*//;s/[ \t]*$//'

Example: 文件中有一行是 MYPARAM=123, 取得 123 这个参数值;

$cat ifile|sed '/^MYPARAM= */!d; s///;q'

Example: 全局替换 sf56 5566;

$cat ifile|sed 's/sf56/5566/g'

Example: 列出以 4 结尾的行 ;

$cat inputfile|sed -n '/4$/p'

Example: 列出以 1-9. 开头的行 ;

$cat inputfile|sed -n '/^[1-9]\./p'

Example: 列出最后一行;

(print the last line of a file (emulates "tail -1")

$cat inputfile|sed '$!d' # method 1

$cat inputfile|sed -n '$p' # method 2

Example: 列出包含 sf56 4523 的行;

$cat ifile|sed -e '/sf56/b' -e '/4523/b' -e d

Example: 替换,全局替换,替换第几处 ...

# substitute (find and replace) "foo" with "bar" on each line

sed 's/foo/bar/' # replaces only 1st instance in a line

sed 's/foo/bar/4' # replaces only 4th instance in a line

sed 's/foo/bar/g' # replaces ALL instances in a line

sed 's/\(.*\)foo\(.*foo\)/\1bar\2/' # replace the next-to-last case

sed 's/\(.*\)foo/\1bar/' # replace only the last case

# substitute "foo" with "bar" ONLY for lines which contain "baz"

sed '/baz/s/foo/bar/g'

# substitute "foo" with "bar" EXCEPT for lines which contain "baz"

sed '/baz/!s/foo/bar/g'

Example: DOS 控制字符 ^M 替换掉 ;

# IN UNIX ENVIRONMENT: convert DOS newlines (CR/LF) to Unix format)

sed 's/^M$//' # in bash/tcsh, press Ctrl-V then Ctrl-M

sed 's/.$//' # assumes that all lines end with CR/LF

sed 's/\x0D$//' # gsed 3.02.80, but top script is easier

# IN UNIX ENVIRONMENT: convert Unix newlines (LF) to DOS format

sed "s/$/`echo -e \\\r`/" # command line under ksh

sed 's/$'"/`echo \\\r`/" # command line under bash

sed "s/$/`echo \\\r`/" # command line under zsh

sed 's/$/\r/' # gsed 3.02.80

# IN DOS ENVIRONMENT: convert Unix newlines (LF) to DOS format

sed "s/$//" # method 1

sed -n p # method 2

# IN DOS ENVIRONMENT: convert DOS newlines (CR/LF) to Unix format

# Cannot be done with DOS versions of sed. Use "tr" instead.

tr -d \r <infile >outfile # GNU tr version 1.22 or higher

Example: 删除文件中的所有空行和由空格组成的行 ;

$cat ifile|sed '/^$/d'|sed '/^[[:space:]]*$/d' # method 1

$cat ifile|sed -e '/^$/d' -e '/^[[:space:]]*$/d' # method 2

Example: 文件中原来有一行 hellohellohello, 现在每个 hello 分一行 , 3 ;

$cat ifile|sed 's/hello/hello@/g'|tr '@' '\n'

( 先将 hello 替换为 hello@, 然后用 tr @ 替换为转义符换行 \n;)

Example: 变成每 5 个字符换一行 ;

$cat ifile|sed 's/\(.\{5,5\}\)/\1@/g' | tr '@' '\n'

[] 的用法在 sed 中表示取 [] 字符组中的一个字符,而 [] 中的第一位若是 "^", 则表示不取后面的任何一个字符。

那么 [^ /]* 就表示匹配这样的格式 :" 由不是空格或 "/" 的一个或多个字符组成的串 .

\([^ /]*\) : 这里 \(......\) 的格式,这种格式用在需要替换的源串中,表示用这种符号括注的部分要 sed 记住,

而且 sed 会给这个部分自动起个名字叫 \1 ,如果在源串中还有这样的标记,就依次命名为 \2,\3......

\1 sed 记住什么呢?是括号里到 \ 前面的 "[^ /]*", 这是说 " 由不是空格或 / 的一个或多个字符组成的串 "

sed -e 的写法可以使 sed 连续执行多套命令 , 例如在一行里面进行多重替换 ;

Example: 替换 ".../...==" "|--...", 然后替换 ".../" "|",

注意第二步为替换任意多的 " 由不是空格或 / 的一个或多个字符组成的串 " "/" 替换为仅 "|";

$cat ifile|sed -e 's/[^ /]*\/\([^ /]*\) ==/|--\1/g' -e 's/[^ /]*\//| /g'

原来文件 :

. /bin == (1kb)

. /bin/sbin/chenFile == (1kb)

. /bin/sbin/shell/dfdf == (1kb)

运行后显示 :

. |--bin (1kb)

. | | |--chenFile (1kb)

. | | | |--dfdf (1kb)

Example: 查找当前目录下的所有子目录 , 并显示其大小 ;( 显示效果对第一第二列进行调整 );

sort -f 是要把输出的结果排序,按字母顺序排序,便于使用的人察看。使用 -f 可以让 sh 排序时对大小写不敏感。

$find . -type d -print | du | awk '{print $2, "== ("$1/2"kb)"}' |sort -f

原来 du 显示 :

4640 ./cc/sh_frt_unix/src

1136 ./cc/sh_frt_unix/tmp

195352 ./cc/sh_frt_unix

运行后显示 :

./cc/sh_frt_unix/src == (2320kb)

./cc/sh_frt_unix/tmp == (568kb)

./cc/sh_frt_unix == (97676kb)

Example: 以上两个 shell 结合

$find . -type d -print | du | awk '{print $2, "== ("$1/2"kb)"}' |sort -f|sed -e 's/[^ /]*\/\([^ /]*\) ==/|--\1/g' -e 's/[^ /]*\//| /g'

Example: 判断目录是否存在;

if [ ! -d $HOME/cc ];then

echo "dir not exist\n"

mkdir -p cc

echo "dir exist\n"

************* 用正则表达式进行字符串处理 ( shell 变量 )********************

# 列出文件中包含 sf56 的一行,假设结果是 1.adfdsf56345345

$i=`cat ifile|sed -n '/sf56/p'`

# 从变量 i 的最左边开始删除字符,直到第一个“ f ”:结果是 dsf56345345

$j=${i#*f}

$echo $j

$echo {i##*/} 从变量 i 的最左边开始删除字符,直到最后一个“ /

$echo ${i#*.} 从变量 i 的最左边开始删除字符,直到第一个“ .

$echo ${i##*.} 从变量 i 的最左边开始删除字符,直到最后一个“ .

$echo ${i%/*} 从右部开始拿掉字符,直到遇到(从右部数起的)第一个“ /

$echo ${i%%/*} 从右部开始拿掉字符,直到遇到(从右部数起的)最后一个“ /

$echo ${i%.*} 从右部开始拿掉字符,直到遇到(从右部数起的)第一个“ .

$echo ${i%%.*} 从右部开始拿掉字符,直到遇到(从右部数起的)最后一个“ .

$echo ${i#????} 去掉前面 4 个字符

$echo ${i%????} 去掉后面 4 个字符

$echo ${i#*[0-9]} 去掉前面所有的数字字符

$echo ${i#1.a} 去掉前面的字符 "1.a"

$str=20041012

$echo $str|cut -c 1-4 取前面 4 个字符;

$echo $str|cut -c 5-7 5-7 个字符; (--------Sed 是基于行处理的,而进一步处理用 cut-------)

$i=`cat ifile|sed '/abc/='` # 获得 abc 所在行的行号;

$cat ifile|sed -n '1,3p' # 显示 1 3 行;

$cat ifile|sed -n '/abc/p' # 显示包含 abc 的行;

$cat ifile|sed '5,$d' # 删除 5 -最后一行;

$cat ifile|sed '/abc/d' # 删除包含 abc 的行;

$cat ifile|sed 's/^.//g' # 删除第一个字符;

$cat ifile|sed 's/.$//g' # 删除最后一个字符;

$cat ifile|sed 's/abc/ABC/g' # 全局替换;

**** 一个自动 ftp shell **************************************

F="myftp"

# 如果提供了参数则上传参数文件 , 否则上传所有文件 ;

toputfile=${1:-*}

echo "open 144.4.0.202 21" > $F

echo "user dpdb_trs dpdb_trs" >> $F

# 二进制传输 ;

echo "bin" >> $F

echo "cd cc/sbin" >> $F

echo "mput $toputfile" >> $F

echo "bye" >> $F

ftp -i -in < $F

rm -rf $F

**************************************************************

******* 一个定时 Job 的写法 (by crontab)**************************

Backup.sh 文件 :

# Delete job;

crontab -r

#Add job;

crontab backup_cron

#List now job;

crontab -l

backup_cron 文件 :

# 执行某个 Shell at everyday 2:00 am

0 2 * * * /$HOME/my_unix/sbin/backup.sh

# 执行某个 Shell at every 1st of month

0 2 1 * * /$HOME/myt_unix/sbin/backup_cleanMon34.sh

**************************************************************

if [ 某条件 ]; then

some statement

有的脚本用

if [[ 某条件 ]]; then

smoe statement

---[[]] 支持通配符 , 不同的 shell 会支持不一样的 .bounse shell 应该不支持 [[ ]],ksh [[ ]] 应该支持

一般情况下, $var ${var} 并没有啥不一样。

但是用 ${ } 会比较精确的界定变量名称的范围,比方说:

$ A=B

$ echo $AB

原本是打算先将 $A 的结果替换出来,然后再补一个 B 字母于其后,

但在命令行上,真正的结果却是只会提换变量名称为 AB 的值出来。若使用 ${ } 就没问题了。

UNIX | SED

---------------+----------------------------------------------------------------

cat | sed ':'

cat -s | sed '/./,/^$/!d'

tac | sed '1!G;h;$!d'

grep | sed '/patt/!d'

grep -v | sed '/patt/d'

head | sed '10q'

head -1 | sed 'q'

tail | sed -e ':a' -e '$q;N;11,$D;ba'

tail -1 | sed '$!d'

tail -f | sed -u '/./!d'

cut -c 10 | sed 's/\(.\)\{10\}.*/\1/'

cut -d: -f4 | sed 's/\(\([^:]*\):\)\{4\}.*/\2/'

tr A-Z a-z | sed 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'

tr a-z A-Z | sed 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'

tr -s ' ' | sed 's/ \+/ /g'

tr -d '\012' | sed 'H;$!d;g;s/\n//g'

wc -l | sed -n '$='

uniq | sed 'N;/^\(.*\)\n\1$/!P;D'

rev | sed '/\n/!G;s/\(.\)\(.*\n\)/&\2\1/;//D;s/.//'

basename | sed 's,.*/,,'

dirname | sed 's,[^/]*$,,'

xargs | sed -e ':a' -e '$!N;s/\n/ /;ta'

paste -sd: | sed -e ':a' -e '$!N;s/\n/:/;ta'

cat -n | sed '=' | sed '$!N;s/\n/ /'

grep -n | sed -n '/patt/{=;p;}' | sed '$!N;s/\n/:/'

2 尝试在 at 里面套 at,

$at 9.00am tomorrow -f /usr/abc/abc.sh

3 at -l

atrm job 3

4 nohup abc.sh >>abc.log 2>&1 & ( 后台运行并重定向 )

7 if [ $1 =0 ]

elif [ $1 = 1 ]

8 if [ ! -w "abc.txt" ];then

echo "can't write"

fi #test if can write

9 if [ ! -d /abc/def ];then

10 if [ -z $APP_DIR ] || [ "$APP_DIR" = "" ];then

echo "environment variable not set"

export APP_DIR=/dev/abc;

11 du -s 显示每个目录占用硬盘大小,结果为块,如 128 ,表示 128 块,每块 512 字节;

df -k 显示磁盘占用情况;

12 head -2 ifile 显示文件的前两行;

13 cp -r 拷贝目录以及子目录;

14 rm -rf 删除目录以及文件;

Shell 脚本例子:

自动 Ping 远端地址:

###############################################

### myping ###

### author:Mainz ###

### 2004.11.29 ###

### line.txt – ServerName 192.168.26.15 ###

###############################################

loop=1

while read LINE

echo "${loop}. `echo ${LINE}|awk '{print $1}'`"

ping -q -c 1 -w 2 `echo ${LINE}|awk '{print $2}'` 2 > /dev/null

if [ $? = 0 ];then

echo "---OK"

echo "--- XX"

loop=`expr ${loop} + 1`

done < line.txt