Linux 学习笔记

. 当前目录
/ 根目录
~ $HOME目录

反斜杠 告诉s h e l l该命令尚未结束

touch:创建新文件

chmod u+l filename:l权限,给文件filename加锁,别的用户不能访问此文件
绝对模式:4:读 2:写 1:执行。例如:744 <==> -rwxr--r--
一次设置该目录下所有文件权限:chmod 744 *; chmod g-w *; chmod a+w *
使用- R选项连同子目录下的文件一起设置:chmod -R 664 /usr/local/home/dave/*

目录的读权限位意味着可以列出其中的内容。写权限位意味着可以在该目录中创建文件.执行权限位则意味着搜索和访问该目录

chown:改变文件属主(同chgrp命令类似)

系统不允许你在创建一个文本文件时赋予它执行权限,必须在创建后用chmod命令手动加上这一权限(目录允许)
umask:命令确定了你创建文件的缺省模式,可用umask 022修改缺省模式,用umask查看缺省模式

符号链接存在两种不同类型的链接,软链接和硬链接,只讨论软链接。软链接实际上就是一个指向文件的指针。
建立链接命令:ln [-s] source_path target_path

find:它可以遍历当前目录甚至于整个文件系统来查找某些文件或目录。$ find . -name "*.txt" -print

echo:回显 echo "test"
echo "test" > filename 将字符串重定向到文件中
echo "test2" >> filename 将字符串追加到文件中,不覆盖原有内容

read:从键盘或文本读入信息,并赋予一个变量。$read name $"test" 将test字符串赋给name变量

cat:显示文件内容,创建文件,还可以用它来显示控制字符。
cat -v filename 显示控制字符
cat file1 file2 ...显示file1 file2...等文件的内容
cat file1 file2 > file3 将file1、file2合并后重定向到file3文件中
cat > filename:向filename文件中输入文本,以ctrl-D结束

管道:可以通过管道把一个命令的输出传递给另一个命令作为输入。
ls | grep -i test :搜索文件名类似test的文件,并显示出来

tee:它把输出的一个副本输送到标准输出,另一个副本拷贝到相应的文件中。如果希望在看到输出的同时,也将其存入一个文件,
那么这个命令再合适不过了。tee [-a] filename. -a:追加到filename文件末尾
ls -l | tee -a filename : 将ls -l命令的输出追加到filename文件末尾

grep :对文本文件进行模式查找
-i:忽略大小写
-c:只输出匹配行的计数
-v:显示不包含匹配文本的所有行
-n:显示匹配的行号、内容
如果要在当前目录下所有.doc文件中查找字符串"sort" : grep "sort" *.doc
grep -c "sort" *.doc 返回:4 即,有4行含有"sort"字符串

如果要抽出记录,使其行首不是48,可以在方括号中使用^记号,表明查询在行首开始。grep '^[^48]' filename
查找开头是b结尾是f的5个字符的串:grep 'b...f' filename
结合使用^和$可查询空行。使用- n参数显示实际行数:grep '^$' filename

awk:格式化报文或从一个大的文本文件中抽取数据包,awk是所有shell过滤工具中最难掌握的
NF:awk的一个内建变量, 代表每行的字段数量
NF的几个用法:
1.排除空行。(因为空行时,NF=0,0为假,不会打印该行)
awk NF filename
2.不输出后面两个字段: awk 'NF-=2' filename
不输出前面两个字段: awk '{for(i=3;i<NF;i++)printf("%s ",$i);print $NF}' filename

变量赋值:$weekbegin="20110701"
显示变量:$echo ${weekbegin}或者echo $weekbegin
清除变量值:$unset weekbegin
使用set命令显示所有本地定义的shell变量。$set
并排显示变量:$echo ${变量1}${变量2}
如果设置了变量值,则使用它,如果未设置,则取新值。 $color="blue"
$echo "The sky is ${color:-grey} today"
The sky is blue today

设置只读变量,设置后就不能更改其值了,否则报错:
$aa="test" $echo ${aa} $readonly aa $aa="add" (错误信息)=>ksh: aa: is read only
要查看所有只读变量,使用命令readonly即可。

传统上,所有环境变量均为大写。环境变量应用于用户进程前,必须用export命令导出。
使用方法一:VARIABLE-NAME=value;export VARIABLE-NAME 在两个命令之间是一个分号,value不加双引号。也可以这样写:
VARIABLE-NAME=value
export VARIABLE-NAME
使用env命令可以查看所有的环境变量。$env
使用unset命令清除环境变量:$unset VARIABLE-NAME

HOME目录,可以简单使用cd命令进入它。$echo $HOME $/db2home/asiainfo $cd $pwd $/db2home/asiainfo

$ PATH=$HOME/bin:.:/bin:/usr/bin;export PATH
使用上面的例子首先查找 H O M E / b i n目录,然后是当前工作目录,然后是 / b i n,最后是/ u s r / b i n。

$# 传递到脚本的参数个数
$* 以一个单字符串显示所有向脚本传递的参数。与位置变量不同,此选项参数可超过 9个
$$ 脚本运行的当前进程I D号
$! 后台运行的最后一个进程的进程I D号
$@ 与$#相同,但是使用时加引号,并在引号中返回每个参数
$- 显示s h e l l使用的当前选项,与s e t命令功能相同
$? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。

反引号用于设置系统命令的输出到变量。$echo `date` $公元2011年09月22日 星期四 13时57分47秒
$mydate=`date` $echo $mydate $公元2011年09月22日 星期四 13时57分47秒
另一个例子中,将反引号嵌在双引号里:$echo "today is `date`" $today is 公元2011年09月22日 星期四 13时57分47秒

打印当前系统上用户数目:$echo "There are `who | wc -l` users on the system"
使用命令e x p r时,用*表示乘法会出现错误,在*前加上反斜线才会正确。
错误:$expr 12*12
正确:$expr 12*12

条件测试:17章
测试数值:[ "number" numeric_operator "number" ]
numeric_operator可为:
-eq 数值相等。 equal
-ne 数值不相等。 not-equal
-gt 第一个数大于第二个数。 greater-than
-lt 第一个数小于第二个数。 less-than
-le 第一个数小于等于第二个数。 less equal
-ge 第一个数大于等于第二个数。 greater equal
if [ $? -gt 1 -o `expr length $1` -lt 10 ]
-a 逻辑与,操作符两边均为真,结果为真,否则为假。
-o 逻辑或,操作符两边一边为真,结果为真,否则为假。
! 逻辑否,条件为假,结果为真。


awk:最基本功能是在文件或字符串中基于指定规则浏览和抽取信息。
BEGIN:打印报告头 END:打印报告尾(BEGIN模式和END模式)
awk 'BEGIN {print "ID filed1 filed2 --------------------------"} {print $1" "$2" "$3} END {print "game over"}' myfile
ID filed1 filed2
--------------------------
11 aa aa'a
123 slfsf ldffolsd:flsv
2313 lsjfo llasdolli
12 bb bb.fglsldi
13 cc bcd"ef
41 dd ddbsd
5 ee eees/fd
6 ff fffew
game over

lappend 命令用来将新元素追加到列表末尾
%lappend new {3 4} "5" {6} 7
=> 1 2 {3 4} 5 6 7 ;#单个词的元素的双引号和花括号被剥离了

在使用find命令时,可能希望先匹配所有的文件,再在子目录中查找。
在下面的例子中,find命令从文件系统的根目录开始,查找一个名为 CON.FILE的文件。
它将首先匹配所有的文件然后再进入子目录中查找。(-depth -print可省略)
$ find / -name "CON.FILE" -depth -print
从当前目录开始查询当前目录及其子目录 $ find . -name "con.file"

#向文件中写入数据的操作
#将This is a test file 写入 myfile.txt中
set filename "/db2home/asiainfo/prov_stat/report/myfile.txt"
set fd [open $filename w]
puts $fd "This is a test file"

#########################
sed用法:
sed -n '2p' myfile:显示文件myfile中第二行内容,-n选项,显示打印定位行。
sed -n '1,3p' myfile:打印1~3行
sed -n '/ff/'p myfile: 匹配单词ff,并打印这一行
sed -n '4,/ff/'p myfile:行号和模式共同查询
sed -n '/$/'p myfile: 匹配元字符$前,先用/转义
sed -n '1,$p' myfile: 显示整个文件内容。$:最后一行。从第一行到最后一行。
sed '1,17d' 删除第1到17行


1.创建sed脚本文件:$pg append.sed
#!/bin/sed -f
/company/ a #:可以用行号代替模式/company/ 如:4 a
The test text!
2.添加执行权限:$chmod u+x append.sed
3.运行sed文件:$append.sed myfile
解释:在myfile文件中找到模式company的行,并在此行后面追加(a)一行The test text!
但是myfile文件中内容不变,因为sed脚本并不操作此文件,而是操作它的一个副本,如果想得到运行结果,运行时重定向到另一个文件中

另:bbbb所在行行前插入文本
#!/bin/sed -f
/bbbb/ i
This line is added!

替换一行:将aaaa所在行替换成abcdef
#!/bin/sed -f
/aaaa/ c
abcdef

替换文本:(不是替换一行,只有匹配上的文本才替换)
sed 's/bb/BBBB/' myfile
结果:bbbb=>BBBBbb
sed 's/bb/BBBB/g' myfile
bbbb=>BBBBBBBB

sed '2d' myfile:删除第二行数据。d:删除。也是操作副本,不是实际源文件。

从shell向sed传值:
要从命令行中向sed传值,值得注意的是用双引号,否则功能不执行。
$NAME='It is a go situation'
$REPLACE='GO'
$echo $NAME | sed "s/go/$REPLACE/g"
输出:It is a GO situation

从sed输出中设置shell变量:
从sed输出中设置shell变量是一个简单的替换过程。运用上面的例子,创建shell变量NEW-NAME,保存上述sed例子的输出结果。
$NAME='It is a go situation'
$REPLACE='GO'
$NEW_NAME=`echo $NAME | sed "/s/go/$REPLACE/g"`
$echo $NEW_NAME
输出:It is a GO situation

sort < bb > aa.out ###:将bb文件中的每行,按照字母顺序排序,然后将结果输出到aa.out文件中(bb作为输入文件,aa.out作为输出文件)
$ mail louise < contents.txt ###:在发送邮件时,可以用重定向的方法发送一个文件中的内容。在下面的例子中,用户
louise将收到一个邮件,其中含有文件contents.txt中的内容:

例如由 /usr/share/doc 要到 /usr/share/man 底下
时,可以写成: 『cd ../man』这就是相对路径的写法啦!相对路径意挃『相对亍目前工作目弽
癿路径!』


mkdir -p /test1/test2/test3
-p:直接将所需目录test3及上层目录递归建立起来.

强制删除目录机器子目录: rm -r test1 (/test1/test2/test3 全部删除)

ls -d:仅列出目录本身,不列出目录内的文件
-R:连同子目录内容一起列出来
aa bb.sh* dw_week.del fzdbb/ myfile sqlnet.log test.sh* test.tcl tmp.sql xinhua/
./fzdbb:
dw_user_townchange_dm.tcl stat_841_unit_indexes_new.tcl test_quxian.tcl tmp.sql
stat_841_cnty_indexes_new.tcl test.tcl testfinal.tcl ww/

./fzdbb/ww:

./xinhua:
dw_newbusi_xinhua_day.tcl dw_newbusi_xinhua_month.tcl dw_newbusi_xinhua_week.tcl test.tcl
-t:以时间排序 (如:ls -lt: 以长格式显示,并且按时间排序,最近时间的文件排在最前面)

cp -i:若目标文件(destination)已经存在时,在覆盖时会先询问动作的进行(常用)
-p:连同档案的属性一起复制过去,而非使用默认属性(备份常用)
-r:递归持续复制,用于目录的复制行为;(常用) 如:ls -r ./test ./test1 (就算test1目录事先不存在也没有问题)


内容查询,有比较多的指令可以用,cat/more/less/tail/tac等等
cat: 由第一行开始显示
tac: 从最后一行开始显示(可以看成tac是cat的倒着写)
nl: 顺便输出行号
more: 一页一页的显示
space:向下翻一页
enter:向下翻一行
/字符串:向下搜寻这个串
:f 显示文件名以及目前显示行数
q 立刻离开more
b 往回翻页
less: 与more类似,但是less能向前翻页
space:向下翻一页
[pagedown]:向下翻动一页
[pageup] :向上翻动一页;
/串:向下搜寻串
?串:向上搜寻串
n:重复前一个搜寻(与/或?有关)
N:反向重复前一个搜寻(与/或?有关)
q:离开
head: 显示前几行
tail: 显示最后几行
-b:显示行号
-n:显示行号(空白行也会有行号,与-b不同)
-v:列出一些看不出来的特殊字符


which: 某个指令放在哪个目录下.如:which ls 结果:usr/bin/ls
type: 某个指令的详细信息(目录/哪个命令的别名alias) 如:type ll ==>ll is an alias for ls -l


cut使用方法:
[root@www ~]# echo $PATH
/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:/usr/X11R6/bin:/usr/games:
[root@www ~]# echo $PATH | cut -d ':' -f 5
以:作为分隔符,因此会出现 /usr/local/bin
-d ':' 以:作为分隔符
-f 5 显示第五个分隔符之前的字符


tee命令:同时将数据流分送到档案去不屏幕 (screen);而输出刡屏幕的,其实就是 stdout,可以让下个指令继续处理
/db2home/asiainfo/wangbin/test PROJSer $ps | tee ./ps.txt | head -1
将ps命令的结果保存到当前目录的ps.txt文件中,并将结果的第一行显示在标准输出(屏幕)中.
-a 以追加方式将结果保存到文件中


$touch a b c 同时建立a、b、c三个空文件
$rm a b c 同时删除a、b、c三个空文件
$mkdir a b c 同时建立三个文件夹
$rmdir a b c 同时删除三个文件夹
$ls [xyz]* 查找以xyz中任何一个字母开头的文件 (包括名字中含有xyz的子目录中的所有文件名称)
$ls [!xyz]* 查找不是以字母xyz开头的文件 (包括名字中含有xyz的子目录中的所有文件名称)
$ls *[xyz]* 查找文件名中含有xyz任何一个字母的文件 (包括名字中含有xyz的子目录中的所有文件名称)


ip地址(注意ip地址的格式必须是:xxx.xxx.xxx.xxx ,xxx的值必须是0-255的一个值,而且第一个 xxx至少是 1 ,最后一个 xxx至少是1。
验证IP地址的正则表达式:
'/^(([1-9]|([1-9]d)|(1dd)|(2([0-4]d|5[0-5]))).)(([1-9]|([1-9]d)|(1dd)|(2([0-4]d|5[0-5]))).){2}([1-9]|([1-9]d)|(1dd)|(2([0-4]d|5[0-5])))$/'


完整的awk打印报告头/报告尾的用法:(注:不要忘记END中的print,文档中没有print,出错了)
awk 'BEGIN {print "1 2 3 4 5 ----------"} {print $1" "$2" "$3" "$4" "$5} END {print "end-of-report"}' data.f

这个 nohup 可以讥你在脱机戒注销系统
后,还能够讥工作继续迚行
nohup ./sleep500.sh


!!...!!之间的部分是在 sqlplus的环境下运行的,exit退出sqlplus,进入shell环境
然后将查询到连接池中的结果重定向到a.txt文件中

#!/usr/bin/ksh
rm -f /db2home/asiainfo/wangbin/test/a.txt >/dev/null 2>&1
sqlplus sdbass/sdyd_ora16@sdbass <<!! >/db2home/asiainfo/wangbin/test/a.txt
select a.export_id
from crmdata_export a;
exit;
!!


#==== 在23:00 2009-03-17 执行程序/bin/sync
[root@www ~]# at 23:00 2009-03-17
at> /bin/sync

#==== 5分钟后执行/bin/sync
[root@www ~]# at now + 5 minutes
at> /bin/sync

xargs的应用:
如:grep -i "####"|awk '{print $2}'
结果: aa
bb
cc
dd
grep -i "####"|awk '{print $2}'|xargs
结果: aa bb cc dd

grep -E应用:
grep -i abc *tcl 从后缀为tcl的文件中搜索abc字段
而,ls | grep -E "aa|bb|cc|dd" 从ls的结果中,搜索含有aa或bb或cc或dd的行,是一种“或”的应用。

关于查看目录或者文件是否存在:
###目录是否存在 -d 参数,存在返回1
if [ -d /db2home/asiainfo/wangbin/test ]
then
echo 存在test目录
else echo 不存在test目录
fi
###文件是否存在 -e 参数
if [ -e /db2home/asiainfo/wangbin/a.tcl ]
then
echo 存在文件
else echo 不存在文件
fi

if [... -a ...] -a:and


--shell中case 用法
[/opt/dsadm/center/sh dw6 ]cat auto_city1.sh
#!/usr/bin/ksh
#auto_city.sh
#程序说明,参数是文件名,返回city_id的值(1-17,18是不分地市的文件)

file_name=$1
file_city=$1
case $file_city in
01) echo 10;;
02) echo 1;;
03) echo 2;;
04) echo 3;;
05) echo 4;;
06) echo 5;;
07) echo 6;;
08) echo 7;;
09) echo 8;;
10) echo 9;;
11) echo 11;;
12) echo 12;;
13) echo 13;;
14) echo 14;;
15) echo 15;;
16) echo 16;;
17) echo 17;;
*) echo 18;;
esac


--运算符两边要有空格
/db2home/asiainfo PROJSer $echo $a$b$c
123
/db2home/asiainfo PROJSer $count=`expr $a + $b + $c`
/db2home/asiainfo PROJSer $echo $count
6
/db2home/asiainfo PROJSer $count=`expr $a+$b+$c`
/db2home/asiainfo PROJSer $echo $count
1+2+3

--AIX设置BEIST时区
判断AIX是否使用了夏时制: $echo $TZ 用这个命令看时区,如果时区以DT结尾就使用了夏时制,如: CST6CDT
设置时区,在目录etc的 /etc/environment 文件下:
/etc dw1 $grep -i beist environment
TZ=BEIST-8
--北京时间:东八区
TZ='BEIST-8'

-- 昨天
TZ='BEIST+16'
举例:
/db2home/asiainfo PROJSer $date
公元2012年02月23日 星期四 17时57分40秒
/db2home/asiainfo PROJSer $export TZ=BEIST+16
/db2home/asiainfo PROJSer $date
公元2012年02月22日 星期三 17时57分45秒

#### 明天
export TZ=BEIST-32
举例:
/db2home/asiainfo PROJSer $export TZ=BEIST-32
/db2home/asiainfo PROJSer $date
公元2012年02月24日 星期五 18时02分30秒


有一些特殊的初始化文件用于执行一些shell配置命令,以点号(.)开始,称为点文件。要显示他们,用 ls -a

cp/mv 命令,用参数 -i 能避免当文件存在时覆盖文件


使用屏蔽一个特殊字符的含义,下列字符可以认为是特殊字符:
$ . ' " * [ ] ^ | ( ) + ?
如:将.转义,.
上述模式不认为反斜杠后面的字符是特殊字符,而是一个普通字符,即句点.
如果要在正则表达式中匹配以 *.pas 结尾的所有文件,可做如下操作: /*/.pas

cp -r dir1 dir2 --将dir1目录下的所有文件复制到dir2中。 -r参数,递归复制
cp -i file1 dir1 --将文件复制到dir1时,如果dir1中有这个文件,则询问

mv -f file1 dir1 --将文件强制移动到目录中,不管目录中有没有同名文件。 -f:强制。force
mv -i file1 dir1 --有相同文件时询问。(同cp)


============================================= 2014/5/6 11:43:18 南昌银行学习记录 ===========================================
--1.
db2inst1@/home/db2inst1/wb>cat > b.sh #建立文件,使用cat复制终端的输入
who|wc -l #程序内容
^D #ctrl+d 表示 end-of-file
db2inst1@/home/db2inst1/wb>chmod +x b.sh #让文件拥有执行权限
db2inst1@/home/db2inst1/wb>b.sh #执行测试
4 #测试结果

说明: who,告诉你现在系统有哪些用户登录

--2.
#!/usr/bin/ksh # #!指定使用哪个unix内核shell

--3.两个命令之间可以用分号分隔
db2inst1@/home/db2inst1>cd zl;ls -l

===========================================
1.查看linux内存: vmstat
2.用nohup & 执行脚本后,提示nohup成功后,还需要按终端上键盘任意键退回到shell输入命令窗口,然后通过在shell中输入exit来退出终端
而我是每次在nohup执行成功后直接点关 闭程序按钮关闭终端.。所以这时候会断掉该命令所对应的session,导致nohup对应的进程被通知需要一起shutdown。

nohup命令可以用来执行其他命令,并且忽略SIGHUP信号(run a command immune to hangups, with output to a non-tty。Run COMMAND, ignoring hangup signals.)
当一个虚拟终端的网络连接断开时,操作系统向正在运行的程序发送SIGHUP信号(HUP = HangUP、挂断),默认情况下这个信号将使程序退出。

3.linux下
3.1 tar基本用法:
tar -cf all.tar *.jpg -- 将所有jpg文件打成一个名为all.tar的包; -c,产生新包; -f,指定包名
tar -rf all.tar a.jpg -- 将a.jpg文件增加到all.tar包中。 -r,增加文件。
tar -uf all.tar logo.jpg -- 1.tar包中的logo.jpg文件。 -u,更新文件
tar -tf all.tar -- 列出包中所有文件. -t,列出文件
tar -xf all.tar -- 解出all.tar包中所有文件. -x,解出 (解包 *.tar )

3.2 tar调用gzip (-z,调用gzip)
tar -czf all.tar.gz *.jpg -- 将所有jpg文件打成一个名为all.tar的包,并将其用gzip压缩,生成一个gzip压缩过的包all.tar.gz
tar -xzf all.tar.gz -- 将上面的压缩包all.tar.gz解开 (解压压缩包 *.tar.gz )

注: AIX下没安装gzip,所以z参数不可用

原文地址:https://www.cnblogs.com/ilvutm/p/7214338.html