awk高級篇
不管學習任何語言,我們學到的都是工具,工具知道的越多,我們做起工作來就越方便,但是工具在你的手里并不一定能造出好的產品,編輯腳本和編程序也是一樣的重要的是算法,別人不知道怎么處理的問題你要知道如何處理。這才能證明你比別人更高,工具只要你慢慢練習都會使用。
下面給大家一個我認為是比較高級的問題了,感興趣的可以自己再想想更好的解決辦法。問題是這樣的我們有一個從ldap里導出的文件,它都是一行一個字段來說明的,每個用戶的數據是已空行分割的。我們必須把對應的uid 和userPassword找出來而且是對應的。
例子:example4.txt
dn: uid=cailiying,domain=ccc.com.cn,o=mail.ccc.com.cn
uid: cailiying
userPassword:: e21kNX0zREl4VEIwODBJdXZkTnU3WFFtS3lRPT0=
letters: 300
quota: 100
dn: uid=caixiaoning,domain=ccc.com.cn,o=mail.ccc.com.cn
userPassword:: e21kNX1kejFXU0doZWprR2RNYnV5ajJJRWl3PT0=
letters: 300
quota: 100
uid: chenzheng
domain: cqc.com.cn
dn: uid=caixiaoning,domain=ccc.com.cn,o=mail.ccc.com.cn
userPassword:: e21kNX1kejFXU0doZWprR2RNYnV5ajJJRWl3PT0=
letters: 300
quota: 100
dn: uid=caixiaoning,domain=ccc.com.cn,o=mail.ccc.com.cn
userPassword:: e21kNX1kejFXU0doZWprR2RNYnV5ajJJRWl3PT0=
letters: 300
quota: 100
uid: chenzheng
domain: cqc.com.cn
處理這個文本我們需要考慮的問題是:
1 uid 和userPassword 并不是每一個段落里都有
2 在每一段里面uid和userPassword 先后順序是隨機的
3 有的段落里可能只有uid 或者只有userPassword
從文本上分析可以看出必須使用的間隔符號,一個是空行,一個是冒號。
冒號我們awk -F:就可以了,不過空行我們不好判斷現在想到length()這個函數,在unix里空行最多只有一個字符,如果一行字符數小于2我們判斷為空行,好現在間隔符號問題解決,空行只能通過循環來實現對空行的判斷。
現在碰到的另外一個問題是我們的某個段里的信息是不完全的,我們就要放棄這段這兒如何來做,就是要做兩個標記變量u 和 p 再做一個循環如果u 和 p 同事滿足我們才輸出結果下面的awk腳本就是通過這個思考來解決ldif文本的處理的!
# 此腳本的目的是方便我們以后導ldap的其他郵件的數據,
# 我們之前使用slapdcat -l 導出所有信息,然后我們需要
# 整理出uid password , 這里的設置都是默認以":" 間隔的
# 例slapcat -l user.ldif 如果想得到一份uid 和userPassword 對應的文件,
# 修改username = "dn"; password = "userpassword"; awk -f ldap2txt.awk user.ldif | grep uid | more 可以查看結果 (有可能是多域的郵件)
# 如果想得到domain 所對應的密碼,修改username = "dn"; password = "userpassword"; 運行 awk -f ldap2txt.awk user.ldif |grep domain | more
#!/bin/awk -f
# File name: ldap2txt.awk
BEGIN {
FS = ":";
username = "uid";
password = "userPassword";
}
{
if(length($0) == 0 )
{
if (name != "u" && pword != "p")
{
printf ("%s:%s", name,pword);
name = "u";
pword = "p";
}
}
else
{
if ($1 == username)
{
name = "u";
name = $0;
}
else if($1 == password)
{
pword = "p";
pword = $0;
}
}
}
END {
}
實際上對于學習語言首先是熟悉一些常用的函數,然后就是試著去解決別人解決過的問題,然后自己再思考一下是不是有更好,速度更快的解決辦法,實際上大部分的程序員都是在重復的使用著別人好的解決辦法,把別人的方法轉變為自己的方法,就是反復練習解決不同的問題,思考更好的方法!
新聞熱點
疑難解答