亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
123下一頁
最近訪問板塊 發(fā)新帖
查看: 14105 | 回復(fù): 21
打印 上一主題 下一主題

求解釋awk getline的用法 [復(fù)制鏈接]

論壇徽章:
10
天蝎座
日期:2013-09-22 22:32:23程序設(shè)計版塊每日發(fā)帖之星
日期:2016-08-07 06:20:00lufei
日期:2016-06-17 17:38:40程序設(shè)計版塊每日發(fā)帖之星
日期:2016-06-12 06:20:002016科比退役紀(jì)念章
日期:2016-05-31 15:47:20CU十四周年紀(jì)念徽章
日期:2016-05-27 12:24:562015年亞洲杯之阿曼
日期:2015-05-03 21:01:352015年辭舊歲徽章
日期:2015-03-03 16:54:15天蝎座
日期:2013-10-20 21:05:24程序設(shè)計版塊每日發(fā)帖之星
日期:2016-08-11 06:20:00
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2011-06-20 16:46 |只看該作者 |倒序瀏覽
本帖最后由 liion631818 于 2011-06-20 16:51 編輯

  1. cat file
  2. 1
  3. 2
  4. 3
  5. 4
  6. awk '{"echo ok" | getline; print}' file
  7. ok
  8. 2
  9. 3
  10. 4
復(fù)制代碼
為什么結(jié)果不是

  1. ok
  2. ok
  3. ok
  4. ok
復(fù)制代碼
可以肯定 "echo ok" | getline 只執(zhí)行了一次,可以通過下面的代碼證明:

  1. awk 'BEGIN{while("echo ok" | getline) print ++i}'
  2. 1
復(fù)制代碼
why???

如果管道前面命令輸出有多行,getline就執(zhí)行失敗了,下面的代碼變量 i 沒有被打印出來

  1. awk 'BEGIN{while("time" | getline)print ++i}'
  2. real    0m0.000s
  3. user    0m0.000s
  4. sys     0m0.000s
復(fù)制代碼
why???

例外,shell中管道2邊會fork出新的進(jìn)程,在awk中怎樣理解?

論壇徽章:
10
天蝎座
日期:2013-09-22 22:32:23程序設(shè)計版塊每日發(fā)帖之星
日期:2016-08-07 06:20:00lufei
日期:2016-06-17 17:38:40程序設(shè)計版塊每日發(fā)帖之星
日期:2016-06-12 06:20:002016科比退役紀(jì)念章
日期:2016-05-31 15:47:20CU十四周年紀(jì)念徽章
日期:2016-05-27 12:24:562015年亞洲杯之阿曼
日期:2015-05-03 21:01:352015年辭舊歲徽章
日期:2015-03-03 16:54:15天蝎座
日期:2013-10-20 21:05:24程序設(shè)計版塊每日發(fā)帖之星
日期:2016-08-11 06:20:00
2 [報告]
發(fā)表于 2011-06-20 17:06 |只看該作者

  1. $ awk 'BEGIN{while("ls -1" | getline)print ++i}'
  2. 1
  3. 2
  4. 3
  5. 4
  6. 5
  7. 6
復(fù)制代碼
想了下,管道就相當(dāng)指定了getline從某個地方去數(shù)據(jù),所以上面描述的現(xiàn)象都是正確的,
while("echo ok" | getline), echo只輸出了一行,所以getline只運行正常了一次,不是我之前理解的每次循環(huán)"echo ok" | getline 都執(zhí)行一次,而是getline每次都執(zhí)行,而echo ok只執(zhí)行一次。

就是不知道上面的time命令怎么沒跟ls一樣正確執(zhí)行了,這點求高手解釋。??

寫了這么多,耽誤大家時間了
When the output of a command is piped to getline and it contains multiple lines, getline reads a
line at a time. The first time getline is called it reads the first line of output. If you call it again, it
reads the second line. To read all the lines of output, you must set up a loop that executes getline
until there is no more output. For instance, the following example uses a while loop to read each line
of output and assign it to the next element of the array, who_out:
while ("who" | getline)
who_out[++i] = $0
Each time the getline function is called, it reads the next line of output. The who command,
however, is executed only once.

論壇徽章:
0
3 [報告]
發(fā)表于 2011-06-20 18:39 |只看該作者
本帖最后由 lionfun 于 2011-06-20 19:36 編輯

回復(fù) 2# liion631818


   我覺得與time的這個命令的特殊性有關(guān)!以下是個人理解:題目中的time命令應(yīng)該是shell的一個保留字, 并且在一個帶有管道的命令行中, 這個命令的行為有些小的變化(就是比較特殊,具體我也不清楚,求高手解釋)。 time的輸出是stderr  將這個time放入subshell執(zhí)行:
  1. [root@station3 ~]# awk 'BEGIN{while("(time;)2>&1" | getline)print ++i}'
  2. 1
  3. 2
  4. 3
  5. 4
復(fù)制代碼
如果是非bash的builtin命令,即/usr/bin/time,就可以重定向:
  1. [root@station3 ~]# /usr/bin/time -p pwd 2>&1 1>/dev/null
  2. real 0.00
  3. user 0.00
  4. sys 0.00
  5. [root@station3 ~]# awk 'BEGIN{while("/usr/bin/time -p pwd 2>&1 1>/dev/null" | getline)print ++i}'
  6. 1
  7. 2
  8. 3
復(fù)制代碼

論壇徽章:
0
4 [報告]
發(fā)表于 2011-06-20 19:52 |只看該作者
回復(fù) 2# liion631818


    對于Shell關(guān)鍵字time,看了http://blog.csdn.net/seizeF/archive/2010/01/09/5164405.aspx的文章,我才明白
   關(guān)鍵字time設(shè)置了一個標(biāo)記,直到pipeline命令執(zhí)行完,time信息才被打印到stderr中。time關(guān)鍵字要整個command和管道,這就是為什么簡單的重定向?qū)τ趖ime而言不起作用,這是Bash語法定義的。command之后的重定向?qū)τ趖ime而言,是command的一部分。
  1. [root@station3 ~]# awk 'BEGIN{while("{ time; } 2>&1" | getline)print ++i}'
  2. 1
  3. 2
  4. 3
  5. 4
復(fù)制代碼

論壇徽章:
1
雙子座
日期:2013-10-17 00:46:45
5 [報告]
發(fā)表于 2011-06-21 01:33 |只看該作者
回復(fù) 2# liion631818


    問下壞小孩,你的這段英文的出處在哪里?

論壇徽章:
2
射手座
日期:2014-10-10 15:59:4715-16賽季CBA聯(lián)賽之上海
日期:2016-03-03 10:27:14
6 [報告]
發(fā)表于 2011-06-21 02:19 |只看該作者
如lionf所說,主要原因是time的輸出是sterr
The  time  command  runs  the  specified program command with the given
       arguments.  When command finishes, time writes a  message  to  standard
       error
giving  timing statistics about this program run.  


getline 接收的是standant input

如:
  1. awk 'BEGIN{while("echo ok >&2" | getline)print ++i}'
  2. ok
復(fù)制代碼

論壇徽章:
10
天蝎座
日期:2013-09-22 22:32:23程序設(shè)計版塊每日發(fā)帖之星
日期:2016-08-07 06:20:00lufei
日期:2016-06-17 17:38:40程序設(shè)計版塊每日發(fā)帖之星
日期:2016-06-12 06:20:002016科比退役紀(jì)念章
日期:2016-05-31 15:47:20CU十四周年紀(jì)念徽章
日期:2016-05-27 12:24:562015年亞洲杯之阿曼
日期:2015-05-03 21:01:352015年辭舊歲徽章
日期:2015-03-03 16:54:15天蝎座
日期:2013-10-20 21:05:24程序設(shè)計版塊每日發(fā)帖之星
日期:2016-08-11 06:20:00
7 [報告]
發(fā)表于 2011-06-21 08:58 |只看該作者
回復(fù) 5# xrzs1986


    Sed & Awk 這本書英文版里的

論壇徽章:
0
8 [報告]
發(fā)表于 2011-06-21 09:13 |只看該作者
回復(fù) 1# liion631818


getline為awk所提供的輸入命令
如果找到一條記錄則getline返回1,如果到了文件結(jié)束(EOF)則返回0,如果錯誤則返回-1
A.getline從整體上來說,應(yīng)這么理解它的用法:
當(dāng)其左右無重定向符 | 或 < 時,getline作用于當(dāng)前文件,讀入當(dāng)前文件的第一行給其后跟的變量var 或$0(無變量);應(yīng)該注意到,由于awk在處理getline之前已經(jīng)讀入了一行,所以getline得到的返回結(jié)果是隔行的。
當(dāng)其左右有重定向符 | 或 < 時,getline則作用于定向輸入文件,由于該文件是剛打開,并沒有被            awk讀入一行,只是getline讀入,那么getline返回的是該文件的第一行,而不是隔行。
B.getline用法大致可分為三大類(每大類又分兩小類),即總共有6種用法。代碼如下:
QUOTE:
awk ‘BEGIN{“cat data.txt”|getline d; print d}’ data2.txt
awk ‘BEGIN{“cat data.txt”|getline; print $0}’ data2.txt  $0可以省略
awk ‘BEGIN{getline d < “data.txt”; print d}’ data2.txt
awk ‘BEGIN{getline < “data.txt”; print $0}’ data2.txt 此種方法不成立
      以上四行代碼均實現(xiàn)“只打印data.txt文件的第一行”(若打印全部行,用循環(huán))
eg. awk ‘BEGIN{FS=”:”;while(getline<”/etc/passwd”>0){print $1}}’ data.txt
awk ‘{getline; print $0”#”$3}’ data.txt
               awk首先讀入第一行接著處理getline函數(shù),然后把下一行指定給$0,現(xiàn)在的$0已經(jīng)是下一行內(nèi)容,后面的#和$3(從$0中。⿻采w$0的內(nèi)容。
awk getline接收用戶輸入,有兩種形式:
getline string  < "/dev/tty"
getline string  < "-"
1)提示用戶輸入?yún)?shù)getline:awk 'BEGIN{print "input sth";getline var <"-" ; print var}'  # 其中 "-" 就是標(biāo)準(zhǔn)輸入,很多工具都支持 "-" ,比如tar/cat等。
2)獲取awk腳本的位置參數(shù):awk 'BEGIN{print ARGV[1],ARGV[2]}' a b

getline怎樣保存shell的全部輸出:
awk 'BEGIN{srs=RS;RS="";"ls ./" | getline TMP;RS=srs;print TMP}'

getline 直接讀取文件,注意BEGIN是預(yù)處理部分,不是action部分,此時還沒有準(zhǔn)備處理文件,指針
也沒有指向文件第1行,在執(zhí)行過程中也不會移動文件指針的。
簡單的說就是BEGIN部分awk是沒有指針的,此時只有g(shù)etline指針,awk只在{ }action部分有指針處理。
awk 'BEGIN{ while (getline d<"aa") print d}'

seq 10|awk '{getline d<"aa";print d}'   #如果getline直接讀一個文件,那么就是逐行讀取的,
因為此時只有g(shù)etline指針,而沒有awk指針來處理該文件。
getline打印偶數(shù)行:
seq 10 | awk '{getline;print}'  # 注意這個和 seq 10 | awk 'BEGIN{while(getline)print}' 有區(qū)別!就是BEGIN部分awk是沒有指針的,此時只有g(shù)etline指針,awk只在{ }action部分有指針處理。
seq 10 | awk 'i++%2'

awk getline兩行互換:
seq 10 | awk '{if(getline tmp)print tmp;print}'   #一般就是判斷getline的返回值 > 0 的

論壇徽章:
10
天蝎座
日期:2013-09-22 22:32:23程序設(shè)計版塊每日發(fā)帖之星
日期:2016-08-07 06:20:00lufei
日期:2016-06-17 17:38:40程序設(shè)計版塊每日發(fā)帖之星
日期:2016-06-12 06:20:002016科比退役紀(jì)念章
日期:2016-05-31 15:47:20CU十四周年紀(jì)念徽章
日期:2016-05-27 12:24:562015年亞洲杯之阿曼
日期:2015-05-03 21:01:352015年辭舊歲徽章
日期:2015-03-03 16:54:15天蝎座
日期:2013-10-20 21:05:24程序設(shè)計版塊每日發(fā)帖之星
日期:2016-08-11 06:20:00
9 [報告]
發(fā)表于 2011-06-21 09:43 |只看該作者
謝謝各位了。。在各位指點下,對time和getline的理解都加深了。。。

論壇徽章:
0
10 [報告]
發(fā)表于 2011-06-21 10:39 |只看該作者
回復(fù) 8# 南極雨


    seq 10 | awk '{if(getline tmp)print tmp;print}'   這段是怎么回事的呢? 想不明白
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP