Core Java是核心競爭力。
一個.java文件中,只能有一個public class文件,因為Sun規定,Java文件名必須與public的類的名稱一致(大小寫)
如果沒有public class,都是一個個class,編譯完成,就會生成若干.class文件。
設置環境變量:
三個變量
JAVA_HOME 指向JDK目錄,主要為其他工具能夠找到JDK。
PATH 添加JAVA_HOME/bin,為了能找到javac ,java 命令
CLASSPATH . 找到.class文件。可以有多個,逐一路徑尋找.class文件,找到第一個為止。好像Unix中,ps有兩種具體實現,但是ps只能調出一個一個意思。
表示類路徑,.為當前目錄。
javac -d . HelloWorld.java
按照源文件包結構生成文件。
package lujl01;
/**
*
*
*/
public class HelloWorld{//類名稱
public static void main(String[] args)
{
System.out.println("My name is ");
}
}
java lujl01.HelloWorld
My name is
byte 1一個字節
short 2個字節
int 4個字節
long 8個字節
int a = 030;
8進制
int a = 0x30
16進制
long l = 40l
byte a = 1;
byte b = 2;
byte c = a + b;
注意,一旦運算,就會變成int。int以下byte,short運算后,一律變為int型。系統對于整型的默認類型就是int。
char 2字節
與int類型互通,而不是short,上面已經說到沒有字面值來區分short,byte,int,系統就按int來記整數。
Java中使用Unicode 2字節來進行字符編碼。
float f = 1.3f;
末尾f必須寫。
double d = 1.3d(或者1.3)
1.3E10,E表示10的為底。
========================
System.out.println(2.0-1.1)
0.899999999999999999
為什么?
因為二進制的缺陷問題,在2進制表達方式下無法進行精確表示0.1,不信可以手算,會丟失精度。
那么float和double決不能用作精確計算領域(金融,證券,銀行),使用java.math.BigDecimal類。
========================
a+b 兩個操作數進行計算,轉換在Java中如何處理。
1.如果任意一個為字符串,有,結果為字符串
2.如果任意一個為double,有,結果為double
3.如果任意一個為float,有,結果為float
4.有無long,有,則結果為long
5.以上都不是,那么就是int
表的建立有4個步驟
1.表名
2.列名
3.主鍵,外鍵,非空,唯一約束
4.外鍵表,外鍵列
5.數據類型
6.數據
建表語句
create table lujl11
(id number(7),
start_date DATE DEFAULT SYSDATE)
在同一個用戶表空間,不能有同名的表。
========================================
RDBMS
---|---------------------------|-------------------|
DB1(TLAB1)
|-----------------------------|-------------------------|
Table Space(users) T.S(temp)
|---------------------|
schema(s0510) (j0510)其他用戶的目錄讀權限
|---------|
s_emp s_dept
為什么sqlplus,一登陸就是某個庫,1個用戶只能登陸一個庫,那么這個庫在.cshrc環境變量中,ORACLE_SID表明。在登錄到對應用戶,使用對應用戶的表空間。
openlab上。
SQL> !more .cshrc
# @(#)cshrc 1.11 89/11/29 SMI
umask 022
setenv ORACLE_BASE /tarenadb
setenv ORACLE_HOME /tarenaora/software/9.0.1
setenv ORACLE_SID TARENADB
=======================================
數據類型
VARCHAR2(size)
CHAR(size)
NUMBER(p,s) p為有效位數,s為小數位數,那么NUMBER(5,2),整數位為3位。
DATE 日期與時間值。
LONG 大文本
RAW和LONG RAW 圖像或者聲音
約束類型
NOT NULL
UNIQUE
PRIMARY KEY
FOREIGN KEY
CHECK
約束起名,如果不起名,系統會分配一個名字,SYS_Cxxxx。
約束 最好是 表名_列名_約束類型
lujl11_dept_id_fk 外鍵
lujl11_id_pk主鍵
lujl11_name_nn非空
lujl11_title_uk唯一
lujl11_salary_ckCHECK約束
定義,有列一級定義也有表一級定義,但是效果完全一樣。
約束與數據是一對矛盾。誰先存在,誰有理,數據已存在,那么得添加約束要符合數據情況。
非空約束,列級約束。
create table friend
(phone varchar2(15) constraint friend_phone_nn NOT NULL,
)
create table lujl04
(
id number(5) constraint lujl04_id_uk unique,
last_name varchar2(10),
first_name varchar2(20),
salary number(10,2),
constraint lujl04_first_last_name_uk
unique(last_name,first_name)
);
表一級約束,constraint開頭。
constraint lujl11_dept_id_fk
foreign key(dept_id)
references s_dept(id)
on delete cascade
級聯刪除
沒有級聯更新。
create table emp_41
as
select id,last_name..
from s_emp
where..
除了非空約束存在,其他丟失。
數據字典
user users
all ------->_-------->views
dba indexs
constraints
user_tables
user_views
user_indexs
user_constraints
user_sequeces
DML
insert into table
values (102,null,....)
insert into table(id)
values(102)
時間問題,依然要重視
insert into s_emp(id,first_name,last_name,start_date)
values
(25,'Donna','Smith',TO_DATE('01-JAN-99 09:00','DD-MON-YY HH:MI'));
update s_emp
set dept_id = 100
where id = 2;
delete from s_emp;
delele from s_emp
where start_date>TO_DATE('01.01.1996','DD.MM.YYYY')
Transaction 事務
一個事務
多個DML語句
但是一旦遇到DCL(grant),DDL(alter,drop)就會自動提交事物
或者COMMIT提交,
或者ROLLBACK回滾到事物開始。
也就是說,如果先插入了很多記錄,再刪很多記錄,沒有commit或者退出,或者DCL,DDL,那么ROLLBACK可以回滾到插入數據之前。
sqlplus--->另外的buff保存著,當前事務涉及到的行,這是操作修改的是buff中的數據,但是這些行記錄被鎖定,行級所,所以可以rollback,一旦提交,就更新到數據庫中了。
除非實時修復DBA能恢復數據。
可以SAVEPOINT,保存事物中間某個標志為,回滾到該標志地方。
ALTER table s_emp
ADD
MODIFY
DROP
約束只能添加和刪除,不能修改(除了alter table jerry03 modify (id null))。
ALTER TABLE s_dept
DROP PRIMARY KEY CASCADE
一個表一個主鍵約束,可以不指定列。正常有外鍵關聯主鍵,主鍵約束不能刪除,除非CASCADE。
ALTER TABLE s_emp
ENABLE CONSTRAINT s_emp_id_pk;
恢復需要一個一個將外鍵的表恢復外鍵約束。
DROP TABLE table CASCADE CONSTRAINTS
Truncate table s_emp;
刪除所有數據,不同于delete from s_emp;,它釋放了表占據的空間。磁盤空間。
建Sequences,序列獨立于表,沒關系,,誰都能用該序列。
create sequence lujl11_id
increment by 1
start with 54
maxvalue 9999999
nocache
nocycle
user_sequences
drop sequence lujl11_id;
View
一面墻上有一幅畫(數據),前面是一面墻,墻上有窗,那就是視圖,不是數據本身,就是select語句,
兩類,簡單視圖(可以DML),復雜視圖(不能DML)。
CREATE OR REPLACE VIEW empvu45
(id_number,employee,job)
as select id,last_name,title
from s_emp
where dept_id = 45
CREATE OR REPLACE VIEW empvu44
AS SELECT *
FROM s_emp
WHERE dept_id = 41
WITH CHECK OPTION CONSTRAINT empvu41_ck;一個約束!
就是條件中(where)出現的列不能修改。
WITH READ ONLY 只讀
INDEX
B*Tree,就是平分法排序,實現快速查找。
索引會提高查詢速度,但會降低插入速度。
1.值分散
2.空值多
3.多列
4.表大
5.更多索引不能提速更多。
1 select rowid,s_dept.*
2* from s_dept
SQL> /
ROWID ID NAME REGION_ID
------------------ ---------- ------------------------- ----------
AAAIlTAAIAAABeqAAA 10 Finance 1
AAAIlTAAIAAABeqAAB 31 Sales 1
AAAIlTAAIAAABeqAAC 32 Sales 2
AAAIlTAAIAAABeqAAD 33 Sales 3
AAAIlTAAIAAABeqAAE 34 Sales 4
AAAIlTAAIAAABeqAAF 35 Sales 5
rowid是地址,天生的主鍵。非空,唯一。
上回,Select DISTINCT dept_id,title from s_emp,注意DISTINCT是作用于兩列的組合。
Group Functions
分組函數
SELECT column,group_function
FROM table
[WHERE condition]
[GROUP BY group_by_expression]
[HAVING group_condition]
[ORDER BY column];
AVG(DISTINCT|ALL|n)
COUNT(DISTINCT|ALL|expr|*)
MAX(DISTINCT|ALL|expr)
MIN(DISTINCT|ALL|expr)
SUM(DISTINCT|ALL|n)
SQL> select AVG(salary),MAX(salary),
2 MIN(salary),SUM(salary)
3 from s_emp
4 where UPPER(title) LIKE 'SALES%';
AVG(SALARY) MAX(SALARY) MIN(SALARY) SUM(SALARY)
----------- ----------- ----------- -----------
1463.75 1515 1400 5855
SQL> select count(*)
2 from s_emp
3 where dept_id=31
4 ;
COUNT(*)
----------
1
SQL> select count(commission_pct)
2 from s_emp
3 where dept_id = 31;
COUNT(COMMISSION_PCT)
---------------------
1
注意,count具體列,只統計非空數目。
1 select dept_id,Count(*) "Number"
2 from s_emp
3* group by dept_id
SQL> /
DEPT_ID Number
---------- ----------
31 1
32 1
33 1
34 1
35 1
41 2
42 2
43 2
44 2
45 3
8
不寫Group by,只是一組,
加了Group by,多組。
出現在Select中,非組函數的值,必須出現加在Group by中。可以不Select某列,但是group by該列,但結果當然也沒有這一列,只是按照它來分組顯示其他組函數數據。
組函數的判斷不能在Where子句中,必須是在Having中。
SELECT title,12*AVG(salary) "ANNUAL SALARY",COUNT(*) "NUMBER OF EMPLOYEES"
FROM s_emp
GROUP BY title
HAVING COUNT(*)>2;
第一步,分組
第二步,應用組函數
第三步,匹配Having子句的組函數
select title,sum(salary) PALALL
FROM s_emp
WHERE title NOT LIKE "VP%"
GROUP BY title
HAVING SUM(salary) > 5000
ORDER BY SUM(salary);
Subqueries 子查詢
select last_name,title
from s_emp
where title=
(select title
from s_emp
where last_name='Smith');
select last_name,title,salary
from s_emp
where salary<
(select avg(salary)
from s_emp);
自查詢有多值返回時,使用IN關鍵字
select last_name,first_name,title
from s_emp
where dept_id IN
(select id
from s_dept
where name = 'Finance' or region_id = 2);
子查詢也可以出現在Having中
Select dept_id,AVG(salary)
from s_emp
group by dept_id
having avg(salary)>
(select avg(salary)
from s_emp
where dept_id=32);
子查詢有效率問題,既能夠用連接又能用子查詢時,請使用連接,一次查詢快!
設置變量
SQL> select id,last_name,salary
2 from s_emp
3 where dept_id=&department_number;
Enter value for department_number:
where title = '&job_title';
一般用于插入數據時,進行定義。
可以保存一個.sql文件,在文件的開頭設定變量,在執行insert,但sqlplus中,只保存sql命令,不保存sqlplus命令,DEFINE和ACCEPT是sqlplus命令。
DEFINE did=105(CHAR) 都是字符型。
insert into lujl11
values (&did,'&address',&salary);
使用ACCEPT命令來進行變量定義,可以區分類型,和添加提示符
ACCEPT p_dname PROMPT 'Provide the department name'
ACCEPT p_salary NUMBER PROMPT 'Salary amoount:'
ACCEPT pswd CHAR PROMPT 'Password:' HIDE
UNDEFINE或者退出sqlplus,會清楚變量。
SET VERIFY ON
察看新舊值開關。
數據庫建模
立項
----〉需求分析
----------------〉設計,設計細化
----------------------------------〉建表,測試(邏輯測試,需求滿足否,物理測試,數據量承受力),優化
--------------------------------------------〉真實數據,產品。
實線---必然的聯系
虛線---可能的聯系
范式
第一范式 解決單值問題。
第二范式 解決依賴性。
第三范式 解決非傳遞性問題。
例子:一想就明白了
經過需求分析,整理出下列屬性。
product#,order#,name,date,price,quantity,customer#,customer_name,customer_address(Province,city,address))
INF分析后
(product#,order#,name,date,price,quantity,customer#,customer_name,Province,City,Address)
2NF分析后
(product#,name,price)
(order#,date,customer#,customer_name,Province,City,Address)
(product#,order#,quantity)
3NF分析后
(product#,name,price)
(order#,date,customer#)
(product#,order#,quantitiy)
(customer#,customer_name,Province,City,Address)
今天安裝FC3,費了些時間,為能夠在自己機器上也跑上Redhat,安裝了Fedora Core 3,http://fedora.linuxsir.org/main/
不錯的網站,我就是照著裝上的,以后就可以研究一下了。哈哈
Data retrieval
-Select
Data manipulation language (DML)
-INSERT,UPDATE,DELETE
Data definition language(DDL
-CREATE,ALTER,DROP,RENAME,TRUNCATE
Transacation control
-COMMIT, ROLLBACK,SAVEPOINT
Data control language(DCL)
-GRANT,REVOKE
使用SQL *Plus進行數據庫操作。
openlab.tarena.ca% sqlplus tarena/tarena@TARENADB
用戶名/密碼
注意這樣登錄是強烈不推薦的,因為這樣別人能看到你的用戶名和密碼。
SQL> !ps -ef|grep sqlplus
lujl 966 955 0 08:43:17 pts/1 0:00 sqlplus tarena/tarena@TARENADB
lujl 969 966 1 08:45:45 pts/1 0:00 /bin/csh -c ps -ef|grep sqlplus
lujl 971 969 0 08:45:45 pts/1 0:00 grep sqlplus
由于本人已有很多編寫SQL語句的經驗,所以只記錄重點信息。
SQL中可以使用數學表達式
+
-
*
/
先乘除后加減。
SQL> select last_name,salary, 12*salary + 100
2 from s_emp
注意每一個子句最好單獨占一行。這樣以便以后的修改,要想寫完就執行,最后添加 ‘;’
1。可以給列取別名 Aliase,
2。可以級聯兩列,作為整體,輸出結果。
SQL> select first_name||last_name "Employees"
2 from s_emp;
Employees
------------------------------
benqu
hui
lgf
liganfeng
lgf
BenDumas
AntoinetteDumas
使用單引號,將字符括起來。
select first_name||' '||last_name
from s_emp;
NULL是一個不確定的值!
對空的任何操作,返回都是空。
使用nvl函數,處理空值,為空就使用默認值。
NVL(salary,1000)
select distinct name
from s_dept;
sqlplus有很多命令。
SQL> help index
Enter Help [topic] for help.
@ COPY PAUSE SHUTDOWN
@@ DEFINE PRINT SPOOL
/ DEL PROMPT SQLPLUS
ACCEPT DESCRIBE QUIT START
APPEND DISCONNECT RECOVER STARTUP
ARCHIVE LOG EDIT REMARK STORE
ATTRIBUTE EXECUTE REPFOOTER TIMING
BREAK EXIT REPHEADER TTITLE
BTITLE GET RESERVED WORDS (SQL) UNDEFINE
CHANGE HELP RESERVED WORDS (PL/SQL) VARIABLE
CLEAR HOST RUN WHENEVER OSERROR
COLUMN INPUT SAVE WHENEVER SQLERROR
COMPUTE LIST SET
CONNECT PASSWORD SHOW
DESCRIBE s_dept
SQL> describe s_dept
Name Null? Type
----------------------------------------- -------- ----------------------------
ID NOT NULL NUMBER(7)
NAME NOT NULL VARCHAR2(25)
REGION_ID
NUMBER(p,s)p為整數位,s為小數位數
VARCHAR2(s)
DATE (Oracle中只有一種日期格式!)
CHAR(s)
SQL Plus 提供了很強的編輯SQL語句的能力。
SQL> l
1 select first_name||last_name "Employees"
2* from s_emp
SQL> 1
1* select first_name||last_name "Employees"
SQL>
list(簡寫l)
列出緩存中的SQL語句。
1(數字)就是將當前編輯行
看前面有*的,為當前編輯行,再才使用行編輯命令,就需要確定是否是想編輯的行。
A[PPEND] text
C[HANGE] /old/new
CL[EAR]BUFF[ER]
DEL
I[NPUT] text
L[IST] n
n text
由于有時會查出很多記錄,這時,需要分頁停頓。
SET PAUSE {[OFF|ON] text}
SAVE file寫緩存到文件
GET file讀入緩存
START filename讀文件到緩存,并執行。
@filename = START filename
EDIT filename
SPOOL filename 開始記錄,并將執行的命令和結果都寫入相應文件。
SPOOL OFF,這時會寫入文件。EXIT,正常退出,也會寫入文件。
關鍵命令
COL[UNM] [{column|alias} [option]]
FOR[MAT] format
9
0
$
L
.
,
col last_name format a15 調整last_name為15字符長度,默認為last_name數據類型的長度。(VARCHAR2(35),那就是35),調整列寬。
HEA[DING] text
設置表頭
JUS[TIFY] {align}
left center right
column last_name HEADING 'Employee|Name' FORMAT A15
column salary JUSTIFY LEFT FORMAT $099,999,99 保證位數,$012,345,00
column start_date FORMAT A8 NULL 'Not hired' 等同于nvl函數
column last_name
顯示某列的格式
column last_name CLEAR
select last_name
from s_emp
order by last_name;
升序默認
desc降序
select last_name,salary*12
from s_emp
order by 2;
按照select子句中的第二項 排序
select last_name,dept_id,salary
from s_emp
order by dept_id,salary DESC;
先按部門排序,如果相同,再按salary降序排。
-------------------------------------------------
where 子句,last_name='Megee',單引號!
日期格式默認為日日-月月月-年年 DD-MON-RR(RR不同于YY,它只取1950到2049年的年,是為解決千年蟲問題設定的)
邏輯比較符
= > >= < <=
SQL比較符
BETWEEN...AND...
IN(LIST) IN(1,3) 1和3
LIKE
IS NULL
邏輯操作符
AND
OR
NOT
不等于!= <> ^=
NOT BETWEEN
NOT IN
NOTLIKE
ISNOTNULL
===============================
LIKE
select last_name from s_emp where last_name like '_M%'
'_' 代表有且只有一格字符
---------------------------
這時,老師發現緩存不夠,察看老師的幾條命令,應用性很強哦。記下來,以后自己用!
du -sk *|sort
當前目錄按照大小的數字排序,
df -k .
察看當前目錄的文件系統使用情況。
rm -rf *
不提示刪除文件
---------------------------
select table_name
from user_tables
where table_name like 'S\_%' ESCAPE '\';
以S_開頭的表名,escape定義了轉義字符\
IS NULL
IS NOT NULL
不要 = null 不出錯,但是邏輯不對!
執行順序
比較操作符〉AND〉OR
==============================
函數
單行函數,輸入一個值,輸出一個值
多行函數,多輸入,單輸出。
LOWER('SQL Course')=sqlcourse
UPPER
INITCAP('SqL COurse')=SqL COurse
CONCAT級聯
SUBSTR('String',1,3)=Str
LENGTH
NVL
ROUND(45.923,2)=45.92
ROUND(45.923,-1)=50
TRUNC(45.923,2)=45.92
TRUNC(45.923,-1)=50
MOD(1600,300)=100 余數
===========================================
Oracle Date Format是重點
日期包括世紀、年、月、日、小時、分鐘、秒幾類數
Oracle時間可以保存10負9次方妙
默認顯示日期格式為DD-MON-RR
SYSDATE一個能返回當前系統時間的函數
select sysdate from dual;
dual是了保證select語句完整性,設置的,沒有實際意義。我認為是個測試函數的好幫手。
YY 05
YYYY 2005
RR 05
RRRR 2005
YEAR two thousand and five
MM 12
MON NOV
MONTH NOVEMBER
DD 18
DDTH 18TH
DDSP EIGHTEEN
DDSPTH EIGHTEENTH
HH 03 (12小時)
HH24 15
MI 31 分鐘
SS 48 秒
AM PM
D 5
DY FRI
DAY FRIDAY
SQL> select to_char(sysdate,'yyyy mm ddhh miss')
2 from dual;
TO_CHAR(SYSDATE,'
-----------------
2005 11 1904 1946
時期+/-數字,可以得到一個新的日期。(加在日子上)
兩個日期相減,得到一個數字。
如果想加小時到日期上,必須先除以24,在與對應日期相加。
1 select to_char(sysdate+0.25,'yyyy mm dd hh miss')
2* from dual
當前時間+6小時的時間。
日期相關函數
MONTHS_BETWEEN('01-SEP-95','11-JAN-94')
19.774194
1 select ROUND(MONTHS_BETWEEN('01-SEP-95','11-JAN-94'))
2* from dual
3 ;
20
返回兩個日期之間的月差值。
ADD_MONTHS('11-JAN-94',6)
NEXT_DAY('01-SEP-95','FRIDAY')
注意:下一個星期幾,但不一定下一周的星期幾,找到第一個為準。
LAST_DAY('01-SEP-98')
'30-SEP-98'
ROUND('25-MAY-95','MONTH')
01-JUN-95
TRUNC('25-MAY-95','MONTH')
01-MAY-95
TO_CHAR(date,'fmt')
fm是一個去除前置0或者空格的開關,fm....fm....
fm作用域,是從當前到下一個fm之間的范圍。第二個fm后面表示不去除前置0,奇偶變。
TO_CHAR(number,'fmt')
9
0
$
L
.
,
TO_NUMBER(char)
char必須是一個‘數字’
TO_DATE(char[,'fmt'])
不給定日期轉換格式,就按照默認的dd-mon-rr,進行轉換。
函數可以嵌套
1 select last_name,
2 NVL(TO_CHAR(MANAGER_ID),'No Manager')
3 from s_emp
4* where manager_id IS NULL
Join方法
等值
非等值
外連接
自連接
必須有連接鍵,否則就是迪卡爾連接。
1 select s.last_name,s.dept_id,d.id,d.name
2 from s_emp s,s_dept d
3* where s.dept_id=d.id
LAST_NAME DEPT_ID ID NAME
--------------- ---------- ---------- -------------------------
Dumas 31 31 Sales
Dumas 32 32 Sales
Dumas 33 33 Sales
payn 34 34 Sales
外連接是一種特殊的等值連接,用于有空值出現時,尋找到所有記錄。
1 select s.last_name,s.id,c.sal,c.name
2 from s_emp s,s_customer c
3* where s.id(+) = c.sal
LAST_NAME ID SAL NAME
--------------- ---------- ---------- -------------------------
Dumas 12 12 athletes attic
Dumas 12 12 great athletes
Dumas 12 12 bj athletics
Dumas 12 12 athletic for all
Dumas 12 12 sports,inc
14 athletics two
14 athletics one
14 shhes for sports
14 athletic attire
那個+ 表示有一側可能沒有對應數據。
表示有部分客戶沒有銷售代表。
如果+ 在另外一側,表示查找所有銷售的客戶情況。
補充兩點
echo 反顯命令
可以用來創建文件
echo aaa>a.txt
echo bbb>>a.txt追加
users 查看在線用戶
比who看到的信息少,但是同時刻用戶數一樣
統計當前在線用戶數
openlab.tarena.ca% users
xiaoyao lujl xiaoyao tanjh
openlab.tarena.ca% users|wc -w
4
等價于
openlab.tarena.ca% who|wc -l
4
===========================================================
find / -name file
find . -mtime 10 -print 修改時間距現在正好10天
find /etc -user 0 -size +400 -print /etc目錄下 user為0,也就是root為owner的文件,并大小大于400的文件
注意兩個條件為與關系,并且大于400,是data block。
1data block = 512bytes 也就是 400 data block = 200K
find ~ -perm 777 > ~/holes
權限為777的
find /export/home -type f atime +365 -exec rm {} \;
注意后面,-exec空格rm空格{}空格\; 一個都不能少,才可執行刪除,刪除目錄-exec rm -r {} \;
可以用于刪除文件名為rm某參數的不可刪除文件
例如
echo aaa>-i 為形成-i的文件
openlab.tarena.ca% rm -i
usage: rm [-fiRr] file ...
那么就需要這樣來刪除
find . -name '-i' -exec rm {} \;
grep -i 不區分大小寫
grep -v 過濾不匹配后面的串
ls -l|grep ^d
那么就是列出該目錄中的子目錄
ls -l|grep -v ^d
列出文件了,因為是-v
與li -l|grep ^-等價
grep file *
到每個文件中尋找"file"串
more file*
可以同時查看多個file1,file2,file3。。。的內容。
diff file1 file2
openlab.tarena.ca% echo aaa>file1
openlab.tarena.ca% echo bbb>file2
openlab.tarena.ca% diff file1 file2
1c1
< aaa
---
> bbb
提示說明,將第一個文件的第一行修改成為bbb
openlab.tarena.ca% more file*
::::::::::::::
file1
::::::::::::::
aaa
ccc
::::::::::::::
file2
::::::::::::::
bbb
openlab.tarena.ca% diff file1 file2
1,2c1
< aaa
< ccc
---
> bbb
提示,第一、二兩行都變成bbb
openlab.tarena.ca% more file*
::::::::::::::
file1
::::::::::::::
aaa
ccc
::::::::::::::
file2
::::::::::::::
aaa
ccc
zzz
openlab.tarena.ca% diff file1 file2
2a3
> zzz
在第一個文件的第二行后,加入第二個文件的第三行的內容
openlab.tarena.ca% more file*
::::::::::::::
file1
::::::::::::::
aaa
ccc
::::::::::::::
file2
::::::::::::::
aaa
ccc
zzz
openlab.tarena.ca% diff file1 file2
2a3,5
>
>
> zzz
第一個文件第二行,加入第二個文件中的3到5行內容。
openlab.tarena.ca% diff file1 file2
6d5
< xxx
----------------------------------------
openlab.tarena.ca% more file1 file2
::::::::::::::
file1
::::::::::::::
aaa
ccc
zzz
xxx
::::::::::::::
file2
::::::::::::::
aaa
ccc
zzz
openlab.tarena.ca% diff file1 file2
5,6d4
<
< xxx
注意是將第一個文件的5到6行刪除,到第二個文件的第四行。
--------------------------------------------------------------------------
ps -ef
e所有進程 f詳細列表方式
PID 進程號
PPID 父進程號
任何進程最后都能追蹤到inetd
sh -> csh -> in.telnetd -> inet -> init(1) -> sched(0)
ps -ef|grep inetd|grep -v grep|wc -l
ps -ef|more 有各列表頭
STIME進程開始時間
TTY 終端 Console
?表示與終端脫離關系的進程,應該是daemon
TIME 累計占用時間
CMD進程名稱
/usr/ucb/ps -auwx|more
ps的另外一個實現版本
進程有幾種狀態,運行,就緒,掛起,僵尸進程。
<default>,由于父進程出現問題,當子進程已經沒有了,告訴父,但是父沒有消除它,這樣造成任在進程表中保留一項,累計多后,對系統造成影響。
上述情況,由程序員造成。解決,殺死父進程。
kill -9 12487
-9表示無條件殺死
pkill sleep
不需要進程號
-------------------------------------
sleep 100 前臺運行,不釋放終端控制
sleep 100& 后臺運行
jobs -l 列任務
bg 任務號
fg 任務號
stop 進程號 掛起后臺進程
Control -z掛起前臺進程。
Control -c放棄前臺進程。
------------------------------------------
ls file*|xargs grep file
分解輸入
grep file file1 file2
查內容了,不等同于ls file*|grep file,將結果給grep,而是分解file*為file1 file2再給grep
--------------------------------------------
/etc/hosts
ip與主機名的對應表
/etc/netmasks
/etc/defaultrouter
默認網關
/etc/hostname.hme0
主機名稱
/etc/resolv.conf
DNS
/etc/nodename
網卡對應的名稱,一臺機器有可能有多個網卡,而主機名只有一個,與/etc/hostname.hme0不同。
ping 127.0.0.1(loop back地址),是檢查邏輯地址有效否?也就是檢查TCP/IP是否安裝好?
netstat -rn 查看硬件
rusers -l tarenalab3
遠程看lab3上的在線用戶。
traceroute www.sina.com.cn
finger user1@tarenalab1
telnet
rlogin hostname -l lujl
----------------------
ftp hostname
lcd 顯示本地目錄,和設置本地目錄
hash 打#每1024
prompt交互信息開關
mget mput
mdelete
rename 可以移動文件!!!!!!!
wall 廣播 Ctrl + D
write
talk
mesg -y|-n
touch命令
如果文件不存在,創建新文件。
文件存在,同時更新訪問和修改時間。
注意文件的更新時間和訪問時間不一樣。
touch file1
vi file1
添加內容。
ls -lt 會看到該文件的最后修改時間。
過一些時候,執行more file參看一下該文件,也就是訪問一下。
ls -lu會看到該文件最后訪問的時間。
這是再touch file1,ls -lt和ls -lu會看到同樣的時間。
做不了事(執行不了動作),你要檢查幾件事!
1.你是誰 (id命令)
openlab.tarena.ca% id
uid=25791 gid=103(tarena)
2.你在哪(pwd),你對某個文件的關系(owner group同組者 other)
3.你是否能在某目錄里做事(讀ls 寫創建文件 執行cd),看看這個目錄的權限
在該目錄下,執行 ls -ld,查看該目錄
注意:回上一級,執行ls -l lujl,是查看該目錄下文件和子目錄的權限。
ls -al lujl 可以查看隱藏文件。
ls -R 將該目錄下所有文件夾遞歸展開
su - somebody 就是將環境變量也更換為somebody的,否則不更新,cd時回原來的用戶的主目錄。
一些基本命令。
mkdir -p dir6/dir7/dir8 可創建層級目錄
cp -i beans apple 文件存在,會提示,-i作用
===============================
openlab.tarena.ca% cp -r dir3 dir4
注意:如果dir4不存在,那么就先建立dir4,在將dir3中內容拷貝過去,如果dir4存在,則是將整個dir3包括dir3本身,整個目錄結構拷貝過去。
openlab.tarena.ca% ls
dir3 file1
openlab.tarena.ca% cp -r dir3 dir4
openlab.tarena.ca% ls -R
.:
dir3 dir4 file1
./dir3:
a.txt
./dir4:
a.txt
openlab.tarena.ca% cd dir4
openlab.tarena.ca% rm *
openlab.tarena.ca% cd
openlab.tarena.ca% ls
dir3 dir4 file1
openlab.tarena.ca% cp -r dir3 dir4
openlab.tarena.ca% ls -R
.:
dir3 dir4 file1
./dir3:
a.txt
./dir4:
dir3
./dir4/dir3:
a.txt
mv 命令相當于給文件改名稱
mv 源 目標
目標不存在,相當于給源改名稱
目標存在,對于文件,覆蓋
對于目錄,移動整個目錄結構到目標目錄中。
openlab.tarena.ca% ls
dir3 file2
openlab.tarena.ca% mkdir dir4
openlab.tarena.ca% ls
dir3 dir4 file2
openlab.tarena.ca% mv dir3 dir4
openlab.tarena.ca% ls -R
.:
dir4 file2
./dir4:
dir3
./dir4/dir3:
a.txt
rm -r[i] directory_name(s)
rmdir只能刪除空目錄
題外話
/tmp 每個系統根下都有一個臨時文件夾,查看該目錄權限,
openlab.tarena.ca% cd /tmp
openlab.tarena.ca% ls -ld
total 64
drwxrwxrwt 4 0 sys 753 11月 15 20:06 .
openlab.tarena.ca%
看好了,那不是777,而是后面有個t,1777,它表示/tmp里,誰都能寫,讀,刪。但是必須是該文件的owner。
chmod 1777 dir
ln
兩種鏈接,
硬連接和符號連接(軟連接)
openlab.tarena.ca% ls -l
total 4
drwxr-xr-x 3 25791 tarena 512 11月 15 20:03 dir4
-rw-r--r-- 1 25791 tarena 13 11月 15 19:38 file2
蘭色表示硬鏈接數,對于目錄,那個數字表示該目錄下文件和子目錄數總和。
openlab.tarena.ca% cp file2 file2.bak
openlab.tarena.ca% ln file2 file2.ln
openlab.tarena.ca% ls -il
total 8
858670 drwxr-xr-x 3 25791 tarena 512 11月 15 20:03 dir4
409639 -rw-r--r-- 2 25791 tarena 13 11月 15 19:38 file2
409792 -rw-r--r-- 1 25791 tarena 13 11月 15 20:23 file2.bak
409639 -rw-r--r-- 2 25791 tarena 13 11月 15 19:38 file2.ln
openlab.tarena.ca%
注意硬鏈接后,被鏈接文件和鏈接文件的inode號,是相同的,他們是同一個inode,硬鏈接號加1。
=================================================
inode i節點 關鍵概念
touch beans這個命令執行時,創建一個文件時到系統中申請一個i節點,如果申請不到,就不會創建成功。
i節點保存這除文件名以外的關于這個文件的所有屬性。大小,屬主,屬組,權限,數據塊指針。
那么那個數據塊(data block)指針,指向一個數據塊。
一個目錄也有inode,inode中數據塊指針指向的數據塊保存著該目錄的文件名與inode的對應信息。
==================================================
軟鏈接
ln -s beans beans.sln
openlab.tarena.ca% ls -il beans*
total 10
409793 -rw-r--r-- 1 25791 tarena 0 11月 15 20:52 beans
409794 lrwxrwxrwx 1 25791 tarena 5 11月 15 20:53 beans.sln -> beans
openlab.tarena.ca%
注意,beans和beans.sln的inode號不同,說明是兩個文件。那么beans.sln的大小是5,基本可以理解為保存著beans的名稱,以便能夠找到它。
這時,more beans.sln實際上 先找到beans.sln的inode-〉數據塊-〉5個字母beans->more beans
系統中就有軟鏈接的例子,
openlab.tarena.ca% cd /
openlab.tarena.ca% ls -l|grep bin
lrwxrwxrwx 1 0 root 9 5月 28 2002 bin -> ./usr/bin
drwxr-xr-x 2 0 sys 1024 5月 16 2004 sbin
openlab.tarena.ca%
可以看到 bin就是./usr/bin的軟鏈接。
man name 查看命令
man -k function 查看函數 man -k setuid
空格
b back
f forward
q
/string search
n 查找一個
ls d??=ls dat
ls [a-f]b*
cd;ls
標準輸出重定向
cal 5 2007>a.txt
cal 5 2007>>a.txt追加
ls -l /etc|more
cal 5 2007|tee cal.lst
tee是個3向頭,既顯示,又重定向到cal.lst文件中。
cal 5 2007|tee -a cal.lst
追加
cat /dev/null > ~/b.txt
清空文件,回收datablock
cat /etc/passwd | awk -F: '{print $1 "\t" $6}' \
|sort >~/userinfo
\是指要換行繼續寫命令
然后就是awk和sed有很強的文本處理能力。
tail -30 a.txt
head -30 a.txt
tail -f ServiceStartupLog.txt
more filename(s)操作和man一樣!
openlab.tarena.ca% who am i
lujl pts/2 11月 15 19:27 (219.236.137.165)
查看登陸用戶
whoami顯示有效用戶。su后,會看到結果。
==========================================================
VI
底行模式 :/? 命令模式 i a o 輸入模式(Esc退出)
kljh 上右下左
i插入
a后
o當前行下插入新行 大寫O當前行上插入新行
vi file1
i
some words
Esc
:w!
直接輸入vi
編輯到最后
Esc
:wq! file2
保存file2,并退出
不保存直接退
:q!
保存后直接退
:wq!
:x!
ZZ
命令模式下
G 最后一行
1G第一行,輸入沒有時間限制
當前屏幕
Shift +L 最下
Shift +H 嘴上
Shift +M中間
Ctrl D 滾下半屏
Ctrl U 滾上半屏
Ctrl F 滾下整屏
Ctrl B 滾上整屏
r 修改一個字母
cw 修改某個單詞
cc 整行
C 替換光標到行尾
yw
yy
p
:1,8co6
:1,6m8
x
dw
dd
5dd
:5,10d
u UNDO
~ 大小寫
J 連接下一行
:set nu
:21=21G
/
?
n 繼續查找
:r file2
:1,$/要替換/新串/g
g表示全部替換
:1,19/^/#/
表示1到19行開頭加入#,注釋掉
^表示行首,這也是為什么Shift +6回到當前行行首,(Shift+4行尾)
hanlj給我們做了精要的開學典禮。
1,時刻想想1萬3千8可不是小數字對于沒畢業的自己,所以當你在能聽講的時候,走神;能練習的時候發呆;能復習的時候,看電視,那你就是在浪費1萬多塊錢!
2,對自己執行歸零操作,如果權限不夠,請使用ROOT強制執行,把你原來那點東西收起來吧,重新輸入正統功力,至少讓達內精英幫你自己原有內功重新梳理,理順吧!
3,專注(專心學習,學好了,挑戰到高薪,才是對關愛你的人最大回報,而不是嘴上說,身邊陪。)
勤勞(多用功,學習容量很大哦)
積極(用最大的熱情去學習每一個知識點,沒有漏洞)
溝通(應該有很多人能夠認識)
4,安排時間,培養好習慣。
學習流程:
[Core Java]JDBC[Core C++][C++ 高級][Java 高級][Web實戰][J2EE OO OA OD][IP計費項目實戰]
今天正題:
[Unix基礎] 老師用最易懂的方式將我看了很多書或者帖子都沒弄懂的問題,搞懂了,印象很深刻。
學習路徑
登錄、登出Solaris系統
漫游Solaris文件系統
建立文件和文件夾,并且改變權限
操作文本文件,并使用vi編輯器
使用命令來查找目錄以及文件
使用基本網絡命令
識別和改變初始化文件,環境變量的設置*(不同Shell)
Solaris = SunOS + CDE
Solaris 2.5 = SunOS 5.5
Solaris 在1980,由Berkeley加入了VM(虛擬存儲)支持,TCP/IP網絡,vi,csh等
三大概念
Kernel
Kernel管理設備,內存,進程,控制系統程序/工具和系統硬件,管理交換去,精靈進程,文件系統和其他功能。
Shell
File System
C Shell和文件系統比較重要對于開發者。
A shell is an interface between the user and the kernel,which acts as an interpreter or translator.
Shell實質上是一個程序,一登錄,系統幫你運行的。
B Shell
K Shell
*C Shell
ba Shell
B Shell系統管理員比較喜歡用,很多啟動腳本中,都是B Shell寫的。
C Shell是B Shell的擴展,支持history,并且編程環境與C類似,每個Shell腳本都是C語言風格。與B Shell的語法不兼容,例如設置環境變量不同的句法不同。
tcsh是csh的增強擴展版本。
ps命令,查看當前用戶使用的Shell。
從csh進入sh,那么csh是sh的父Shell。exit退出子Shell,回到上一級Shell。
進入系統的默認Shell,叫做登錄Shell,在/etc/passwd中記錄。
bash有保存命令歷史的作用,支持 上 下 鍵。
$su進入超級用戶root。
Solaris文件系統
命令df -k,查看目錄,與文件系統關系以及使用情況。
會發現,
/dev/dsk/c0t0d0
/dev/dsk/c0t1d0
如果c0t0d0部分不完全相同,表示兩塊硬盤,那么上面的是兩塊物理硬盤。
c控制位,t目標位,d磁盤位。
那么對于一個5G的磁盤,要進行分區,那么分出來的叫做Slice:片
c0t0d0s0~c0t0d0s7,一共是8個,但是c0t0d0s2表示整個磁盤不能分,也就不能表示。所以一塊磁盤最多分7個Slice。
/c0t0d0 ------> format -------> s0 2G大小 s1 3G大小。
/c0t0d0s0 -------> newfs 做文件系統,那么文件系統是建立在Slice上的。那么newfs實質上是在分數據塊block.
那么最后新的文件系統要掛接到(mount)到根上,那么就是鉤在目錄上。
掛接命令mount /dev/dsk/c0t0d0s0 /opt
那么可以仔細看一下文件系統了。
/dev/dsk/c0t1d0s0 8260757 4269347 3908803 /newusers
8260757 由于是以kbytes為單位,三位一分,基本上是8G總大小。
===================================================================
/sbin/ifconfig -a 查看ip地址。
====================
more /etc/passwd
luolu:x:30662:10::/newusers/sd0510/luolu:/bin/csh
用戶名:密碼位(密碼信息存在在/etc/shadow中,密文保存):UID:GID::主目錄:登陸Shell。
===================================================================
pwd - print working directory
cd ~hiloo 表示進入hiloo的主目錄。cd直接空格和cd ~表示自己的主目錄。
cd ../.. 退兩級
查看文件類型的三種方式
ls -l
- 文件 d 目錄
file 文件名
ls -F
顯示文件類型
目錄的讀權限,是否可以查看文件列表
目錄的寫權限,是否可以生成文件和子目錄或者刪除文件與子目錄
執行權限,就是指是否可以'cd 該目錄'
rw- r-- r--
對owner 對同組其他人 對其他人
可以看成由9個0和1組成,所以000到111,對每類用戶的權限是8種變化,值為0到7。
rwx r-x r-w 755
rw- r-- r-- 644
只有root和某文件的owner才能修改該文件的權限。
改變文件權限的兩種方式:
chmod 644 file
chmod 755 file
chmod g-r file1
chmod u+x,go+r file1在原有權限基礎上,給文件owner加執行權限,給同組和其他人加讀權限。
chmod a=rw file1 (表示讓所有用戶,都是rw權限,那么就是666)
touch filename(s)
今天終于有時間去聽課了,高興。
今天最重要的收獲,了解了衡量自己的幾個基本方面。
1,就是知識結構層次,教育程度
2,技術技能,實際的應用
3,經驗,那么做過某項工作,和沒做過肯定是不一樣的。
4,閱歷,閱歷主要是指正確知識或者認知,在遇到很多事情時,得到驗證,而獲得的新的體會。
還有人成功的幾點
1,品德,
2,毅力,
3,抓住每次機遇,不一是享福,好的機遇,很多吃苦的機會,也是很重要的。比如三伏天對著電腦,漢流夾背的編程,編一天。或者其他吃苦的機會。為什么?!其實很簡單,人類的潛意識會告訴你答案,當你在人生路上再遇到很難過的時候,你會想到之前那么苦,那么累都能支撐過來,這算什么!所以任何機會都是鍛煉人的!
4,積累人脈,