精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

為你的 awk 腳本注入 Groovy

開(kāi)發(fā) 后端
awk 和 Groovy 相輔相成,可以創(chuàng)建強(qiáng)大、有用的腳本。

最近我寫(xiě)了一個(gè)使用 Groovy 腳本來(lái)清理我的音樂(lè)文件中的標(biāo)簽的系列。我開(kāi)發(fā)了一個(gè) ??框架??,可以識(shí)別我的音樂(lè)目錄的結(jié)構(gòu),并使用它來(lái)遍歷音樂(lè)文件。在該系列的最后一篇文章中,我從框架中分離出一個(gè)實(shí)用類(lèi),我的腳本可以用它來(lái)處理文件。

這個(gè)獨(dú)立的框架讓我想起了很多 awk 的工作方式。對(duì)于那些不熟悉 awk 的人來(lái)說(shuō),你學(xué)習(xí)下這本電子書(shū):

??《awk 實(shí)用指南》??

我從 1984 年開(kāi)始大量使用 awk,當(dāng)時(shí)我們的小公司買(mǎi)了第一臺(tái)“真正的”計(jì)算機(jī),它運(yùn)行的是 System V Unix。對(duì)我來(lái)說(shuō),awk 是非常完美的:它有關(guān)聯(lián)內(nèi)存associative memory——將數(shù)組視為由字符串而不是數(shù)字來(lái)索引的。它內(nèi)置了正則表達(dá)式,似乎專(zhuān)為處理數(shù)據(jù)而生,尤其是在處理數(shù)據(jù)列時(shí),而且結(jié)構(gòu)緊湊,易于學(xué)習(xí)。最后,它非常適合在 Unix 工作流使用,從標(biāo)準(zhǔn)輸入或文件中讀取數(shù)據(jù)并寫(xiě)入到輸出,數(shù)據(jù)不需要經(jīng)過(guò)其他的轉(zhuǎn)換就出現(xiàn)在了輸入流中。

說(shuō) awk 是我日常計(jì)算工具箱中的一個(gè)重要部分一點(diǎn)也不為過(guò)。然而,在我使用 awk 的過(guò)程中,有幾件事讓我感到不滿(mǎn)意。

可能主要的問(wèn)題是 awk 善于處理以分隔字段呈現(xiàn)的數(shù)據(jù),但很奇怪它不善于處理 CSV 文件,因?yàn)?CSV 文件的字段被引號(hào)包圍時(shí)可以嵌入逗號(hào)分隔符。另外,自 awk 發(fā)明以來(lái),正則表達(dá)式已經(jīng)有了很大的發(fā)展,我們需要記住兩套正則表達(dá)式的語(yǔ)法規(guī)則,而這并不利于編寫(xiě)無(wú) bug 的代碼。??一套這樣的規(guī)則已經(jīng)很糟糕了??。

由于 awk 是一門(mén)簡(jiǎn)潔的語(yǔ)言,因此它缺少很多我認(rèn)為有用的東西,比如更豐富的基礎(chǔ)類(lèi)型、結(jié)構(gòu)體、??switch?? 語(yǔ)句等等。

相比之下,Groovy 擁有這些能力:可以使用 ??OpenCSV 庫(kù)???,它很擅長(zhǎng)處理 CSV 文件、Java 正則表達(dá)式和強(qiáng)大的匹配運(yùn)算符、豐富的基礎(chǔ)類(lèi)型、類(lèi)、??switch?? 語(yǔ)句等等。

Groovy 所缺乏的是簡(jiǎn)單的面向管道的概念,即把要處理數(shù)據(jù)作為一個(gè)傳入的流,以及把處理過(guò)的數(shù)據(jù)作為一個(gè)傳出的流。

但我的音樂(lè)目錄處理框架讓我想到,也許我可以創(chuàng)建一個(gè) Groovy 版本的 awk “引擎”。這就是我寫(xiě)這篇文章的目的。

安裝 Java 和 Groovy

Groovy 是基于 Java 的,需要先安裝 Java。最新的、合適的 Java 和 Groovy 版本可能都在你的 Linux 發(fā)行版的軟件庫(kù)中。Groovy 也可以按照 ??Groovy 主頁(yè)??? 上的說(shuō)明進(jìn)行安裝。對(duì)于 Linux 用戶(hù)來(lái)說(shuō),一個(gè)不錯(cuò)的選擇是 ??SDKMan??,它可以用來(lái)獲得多個(gè)版本的 Java、Groovy 和其他許多相關(guān)工具。在這篇文章中,我使用的是 SDK 的版本:

  • Java:OpenJDK 11 的 11.0.12 的開(kāi)源版本
  • Groovy:3.0.8

使用 Groovy 創(chuàng)建 awk

這里的基本想法是將打開(kāi)一個(gè)或多個(gè)文件進(jìn)行處理、將每行分割成字段、以及提供對(duì)數(shù)據(jù)流的訪問(wèn)等復(fù)雜情況封裝在三個(gè)部分:

  • 在處理數(shù)據(jù)之前
  • 在處理每行數(shù)據(jù)時(shí)
  • 在處理完所有數(shù)據(jù)之后

我并不打算用 Groovy 來(lái)取代 awk。相反,我只是在努力實(shí)現(xiàn)我的典型用例,那就是:

  • 使用一個(gè)腳本文件而不是在命令行寫(xiě)代碼
  • 處理一個(gè)或多個(gè)輸入文件
  • 設(shè)置默認(rèn)的分隔符為??|??,并基于這個(gè)分隔符分割所有行
  • 使用 OpenCSV 完成分割工作(awk 做不到)

框架類(lèi)

下面是用 Groovy 類(lèi)實(shí)現(xiàn)的 “awk 引擎”:

@Grab('com.opencsv:opencsv:5.6')
import com.opencsv.CSVReader
public class AwkEngine {
// With admiration and respect for
// Alfred Aho
// Peter Weinberger
// Brian Kernighan
// Thank you for the enormous value
// brought my job by the awk
// programming language
Closure onBegin
Closure onEachLine
Closure onEnd
private String fieldSeparator
private boolean isFirstLineHeader
private ArrayList<String> fileNameList
public AwkEngine(args) {
this.fileNameList = args
this.fieldSeparator = "|"
this.isFirstLineHeader = false
}
public AwkEngine(args, fieldSeparator) {
this.fileNameList = args
this.fieldSeparator = fieldSeparator
this.isFirstLineHeader = false
}
public AwkEngine(args, fieldSeparator, isFirstLineHeader) {
this.fileNameList = args
this.fieldSeparator = fieldSeparator
this.isFirstLineHeader = isFirstLineHeader
}
public void go() {
this.onBegin()
int recordNumber = 0
fileNameList.each { fileName ->
int fileRecordNumber = 0
new File(fileName).withReader { reader ->
def csvReader = new CSVReader(reader,
this.fieldSeparator.charAt(0))
if (isFirstLineHeader) {
def csvFieldNames = csvReader.readNext() as
ArrayList<String>
csvReader.each { fieldsByNumber ->
def fieldsByName = csvFieldNames.
withIndex().
collectEntries { name, index ->
[name, fieldsByNumber[index]]
}
this.onEachLine(fieldsByName,
recordNumber, fileName,
fileRecordNumber)
recordNumber++
fileRecordNumber++
}
} else {
csvReader.each { fieldsByNumber ->
this.onEachLine(fieldsByNumber,
recordNumber, fileName,
fileRecordNumber)
recordNumber++
fileRecordNumber++
}
}
}
}
this.onEnd()
}
}

雖然這看起來(lái)是相當(dāng)多的代碼,但許多行是因?yàn)樘L(zhǎng)換行了(例如,通常你會(huì)合并第 38 行和第 39 行,第 41 行和第 42 行,等等)。讓我們逐行看一下。

第 1 行使用 ??@Grab??? 注解從 ??Maven Central?? 獲取 OpenCSV 庫(kù)的 5.6 本周。不需要 XML。

第 2 行我引入了 OpenCSV 的 ??CSVReader?? 類(lèi)

第 3 行,像 Java 一樣,我聲明了一個(gè) ??public??? 實(shí)用類(lèi) ??AwkEngine??。

第 11-13 行定義了腳本所使用的 Groovy 閉包實(shí)例,作為該類(lèi)的鉤子。像任何 Groovy 類(lèi)一樣,它們“默認(rèn)是 ??public???”,但 Groovy 將這些字段創(chuàng)建為 ??private??,并對(duì)其進(jìn)行外部引用(使用 Groovy 提供的 getter 和 setter 方法)。我將在下面的示例腳本中進(jìn)一步解釋這個(gè)問(wèn)題。

第 14-16 行聲明了 ??private?? 字段 —— 字段分隔符,一個(gè)指示文件第一行是否為標(biāo)題的標(biāo)志,以及一個(gè)文件名的列表。

第 17-31 行定義了三個(gè)構(gòu)造函數(shù)。第一個(gè)接收命令行參數(shù)。第二個(gè)接收字段的分隔符。第三個(gè)接收指示第一行是否為標(biāo)題的標(biāo)志。

第 31-67 行定義了引擎本身,即 ??go()?? 方法。

第 33 行調(diào)用了 ??onBegin()??? 閉包(等同于 awk 的 ??BEGIN {}?? 語(yǔ)句)。

第 34 行初始化流的 ??recordNumber???(等同于 awk 的 ??NR?? 變量)為 0(注意我這里是從 00 而不是 1 開(kāi)始的)。

第 35-65 行使用 ??each??? ??{}?? 來(lái)循環(huán)處理列表中的文件。

第 36 行初始化文件的 ??fileRecordNumber???(等同于 awk 的 ??FNR?? 變量)為 0(從 0 而不是 1 開(kāi)始)。

第 37-64 行獲取一個(gè)文件對(duì)應(yīng)的 ??Reader?? 實(shí)例并處理它。

第 38-39 行獲取一個(gè) ??CSVReader?? 實(shí)例。

第 40 行檢測(cè)第一行是否為標(biāo)題。

如果第一行是標(biāo)題,那么在 41-42 行會(huì)從第一行獲取字段的標(biāo)題名字列表。

第 43-54 行處理其他的行。

第 44-48 行把字段的值復(fù)制到 ??name:value?? 的映射中。

第 49-51 行調(diào)用 ??onEachLine()??? 閉包(等同于 awk 程序 ??BEGIN {}??? 和 ??END {}??? 之間的部分,不同的是,這里不能輸入執(zhí)行條件),傳入的參數(shù)是 ??name:value?? 映射、處理過(guò)的總行數(shù)、文件名和該文件處理過(guò)的行數(shù)。

第 52-53 行是處理過(guò)的總行數(shù)和該文件處理過(guò)的行數(shù)的自增。

如果第一行不是標(biāo)題:

第 56-62 行處理每一行。

第 57-59 調(diào)用 ??onEachLine()?? 閉包,傳入的參數(shù)是字段值的數(shù)組、處理過(guò)的總行數(shù)、文件名和該文件處理過(guò)的行數(shù)。

第 60-61 行是處理過(guò)的總行數(shù)和該文件處理過(guò)的行數(shù)的自增。

第 66 行調(diào)用 ??onEnd()??? 閉包(等同于 awk 的 ??END {}??)。

這就是該框架的內(nèi)容。現(xiàn)在你可以編譯它:

$ groovyc AwkEngine.groovy

一點(diǎn)注釋?zhuān)?/p>

如果傳入的參數(shù)不是一個(gè)文件,編譯就會(huì)失敗,并出現(xiàn)標(biāo)準(zhǔn)的 Groovy 堆棧跟蹤,看起來(lái)像這樣:

Caught: java.io.FileNotFoundException: not-a-file (No such file or directory)
java.io.FileNotFoundException: not-a-file (No such file or directory)
at AwkEngine$_go_closure1.doCall(AwkEngine.groovy:46)

OpenCSV 可能會(huì)返回 ??String[]??? 值,不像 Groovy 中的 ??List??? 值那樣方便(例如,數(shù)組沒(méi)有 ??each {}???)。第 41-42 行將標(biāo)題字段值數(shù)組轉(zhuǎn)換為 list,因此第 57 行的 ??fieldsByNumber?? 可能也應(yīng)該轉(zhuǎn)換為 list。

在腳本中使用這個(gè)框架

下面是一個(gè)使用 ??AwkEngine??? 來(lái)處理 ??/etc/group?? 之類(lèi)由冒號(hào)分隔并沒(méi)有標(biāo)題的文件的簡(jiǎn)單腳本:

def ae = new AwkEngine(args, ':')
int lineCount = 0
ae.onBegin = {
println “in begin”
}
ae.onEachLine = { fields, recordNumber, fileName, fileRecordNumber ->
if (lineCount < 10)
println “fileName $fileName fields $fields”
lineCount++
}
ae.onEnd = {
println “in end”
println “$lineCount line(s) read”
}
ae.go()

第 1 行 調(diào)用的有兩個(gè)參數(shù)的構(gòu)造函數(shù),傳入了參數(shù)列表,并定義冒號(hào)為分隔符。

第 2 行定義一個(gè)腳本級(jí)的變量 ??lineCount???,用來(lái)記錄處理過(guò)的行數(shù)(注意,Groovy 閉包不要求定義在外部的變量為 ??final??)。

第 3-5 行定義 ??onBegin()?? 閉包,在標(biāo)準(zhǔn)輸出中打印出 “in begin” 字符串。

第 6-10 行定義 ??onEachLine()??? 閉包,打印文件名和前 10 行字段,無(wú)論是否為前 10 行,處理過(guò)的總行數(shù) ??lineCount?? 都會(huì)自增。

第 11-14 行定義 ??onEnd()?? 閉包,打印 “in end” 字符串和處理過(guò)的總行數(shù)。

第 15 行運(yùn)行腳本,使用 ??AwkEngine??。

像下面一樣運(yùn)行一下腳本:

$ groovy Test1Awk.groovy /etc/group
in begin
fileName /etc/group fields [root, x, 0, ]
fileName /etc/group fields [daemon, x, 1, ]
fileName /etc/group fields [bin, x, 2, ]
fileName /etc/group fields [sys, x, 3, ]
fileName /etc/group fields [adm, x, 4, syslog,clh]
fileName /etc/group fields [tty, x, 5, ]
fileName /etc/group fields [disk, x, 6, ]
fileName /etc/group fields [lp, x, 7, ]
fileName /etc/group fields [mail, x, 8, ]
fileName /etc/group fields [news, x, 9, ]
in end
78 line(s) read
$

當(dāng)然,編譯框架類(lèi)生成的 ??.class??? 文件需要在 classpath 中,這樣才能正常運(yùn)行。通常你可以用 ??jar?? 把這些 class 文件打包起來(lái)。

我非常喜歡 Groovy 對(duì)行為委托的支持,這在其他語(yǔ)言中需要各種詭異的手段。許多年來(lái),Java 需要匿名類(lèi)和相當(dāng)多的額外代碼。Lambda 已經(jīng)在很大程度上解決了這個(gè)問(wèn)題,但它們?nèi)匀徊荒芤闷浞秶獾姆?final 變量。

下面是另一個(gè)更有趣的腳本,它很容易讓人想起我對(duì) awk 的典型使用方式:

def ae = new AwkEngine(args, ';', true)
ae.onBegin = {
// nothing to do here
}
def regionCount = [:]
ae.onEachLine = { fields, recordNumber, fileName, fileRecordNumber ->
regionCount[fields.REGION] =
(regionCount.containsKey(fields.REGION) ?
regionCount[fields.REGION] : 0) +
(fields.PERSONAS as Integer)
}
ae.onEnd = {
regionCount.each { region, population ->
println “Region $region population $population”
}
}
ae.go()

第 1 行調(diào)用了三個(gè)函數(shù)的構(gòu)造方法,??true??? 表示這是“真正的 CSV” 文件,第一行為標(biāo)題。由于它是西班牙語(yǔ)的文件,因此它的逗號(hào)表示數(shù)字的??點(diǎn)??,標(biāo)準(zhǔn)的分隔符是分號(hào)。

第 2-4 行定義 ??onBegin()?? 閉包,這里什么也不做。

第 5 行定義一個(gè)(空的)??LinkedHashmap??,鍵是 String 類(lèi)型,值是 Integer 類(lèi)型。數(shù)據(jù)文件來(lái)自于智利最近的人口普查,你要在這個(gè)腳本中計(jì)算出智利每個(gè)地區(qū)的人口數(shù)量。

第 6-11 行處理文件中的行(加上標(biāo)題一共有 180,500 行)—— 請(qǐng)注意在這個(gè)案例中,由于你定義 第 1 行為 CSV 列的標(biāo)題,因此 ??fields??? 參數(shù)會(huì)成為 ??LinkedHashMap<String,String>?? 實(shí)例。

第 7-10 行是 ??regionCount??? 映射計(jì)數(shù)增加,鍵是 ??REGION??? 字段的值,值是 ??PERSONAS?? 字段的值 —— 請(qǐng)注意,與 awk 不同,在 Groovy 中你不能在賦值操作的右邊使用一個(gè)不存在的映射而期望得到空值或零值。

第 12-16 行,打印每個(gè)地區(qū)的人口數(shù)量。

第 17 行運(yùn)行腳本,調(diào)用 ??AwkEngine?? 。

像下面一樣運(yùn)行一下腳本:

$ groovy Test2Awk.groovy ~/Downloads/Censo2017/ManzanaEntidad_CSV/Censo*csv
Region 1 population 330558
Region 2 population 607534
Region 3 population 286168
Region 4 population 757586
Region 5 population 1815902
Region 6 population 914555
Region 7 population 1044950
Region 8 population 1556805
Region 16 population 480609
Region 9 population 957224
Region 10 population 828708
Region 11 population 103158
Region 12 population 166533
Region 13 population 7112808
Region 14 population 384837
Region 15 population 226068
$

以上為全部?jī)?nèi)容。對(duì)于那些喜歡 awk 但又希望得到更多的東西的人,我希望你能喜歡這種 Groovy 的方法。

責(zé)任編輯:龐桂玉 來(lái)源: Linux中國(guó)
相關(guān)推薦

2016-10-08 20:58:50

awkLinux編寫(xiě)腳本

2012-11-19 11:09:15

IBMdw

2009-06-12 18:30:12

Groovy 靜態(tài)ma

2022-06-04 08:29:27

awk命令BEGIN

2022-01-21 10:42:55

IT領(lǐng)導(dǎo)者IT事業(yè)職業(yè)顧問(wèn)

2019-12-09 14:13:41

awkPython編程語(yǔ)言

2013-04-17 10:20:27

GroovyClassLoader

2023-01-02 23:58:03

2009-12-28 10:16:48

Groovy 1.7

2013-04-26 11:39:40

2020-12-08 08:14:11

SQL注入數(shù)據(jù)庫(kù)

2021-01-15 07:44:21

SQL注入攻擊黑客

2025-08-26 10:30:01

2010-08-25 10:42:20

GroovyGroovy++

2020-09-28 18:19:15

awkLinux

2019-11-28 08:59:03

SQL注入網(wǎng)絡(luò)攻擊網(wǎng)絡(luò)安全

2019-06-02 22:22:16

2009-12-09 09:41:56

Linux系統(tǒng)

2009-11-27 10:56:07

Suse模塊

2009-10-23 13:08:23

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

久久裸体网站| 秋霞国产精品| 久久久噜噜噜久噜久久综合| 国产成人精品视频在线观看| 小泽玛利亚一区| www.亚洲一二| 欧美性色黄大片手机版| 黄色一级片网址| 亚洲 另类 春色 国产| 青青草国产精品97视觉盛宴| 精品综合久久久久久97| 性欧美精品中出| 亚洲精品在线a| 在线看日韩精品电影| 黄色一级视频播放| 青青久在线视频免费观看| 狠狠色丁香久久婷婷综合_中| 国模gogo一区二区大胆私拍 | 亚洲精品大片| 精品福利视频导航| 蜜桃网站在线观看| 成人午夜影视| 91一区二区三区在线观看| 成人淫片在线看| 久草视频在线免费| 日韩天堂av| 欧美人在线观看| 任我爽在线视频| 国产免费久久| 日韩激情第一页| caopor在线| 精品国产亚洲一区二区三区| 欧美视频精品在线观看| 国产精品50p| 俄罗斯一级**毛片在线播放| 亚洲色欲色欲www| 亚洲精品国产精品国自产| 污视频在线免费观看| 国产高清一区日本| 亚洲精品女av网站| 99国产精品99| 久久精品999| 国产精品久久久久久久天堂| 九九九在线观看| 国产精品永久| 欧美一级大片在线观看| 日韩字幕在线观看| 欧美色图首页| 欧美激情一区二区三区久久久| 国产人与禽zoz0性伦| 久久国产中文字幕| 综合国产在线视频| 999福利视频| 999国产精品永久免费视频app| 国产一区二区三区日韩欧美| 精品无码国产污污污免费网站| 校花撩起jk露出白色内裤国产精品| 欧美精品一区二区三区四区| 丰满熟女人妻一区二区三区| 国产精品自在| 日韩av在线看| 国产传媒国产传媒| 日韩av二区| 精品国产依人香蕉在线精品| 神马午夜精品91| 欧美福利专区| 久久久久亚洲精品国产| 日韩字幕在线观看| 三级久久三级久久久| 国产精彩精品视频| 中文字幕 自拍偷拍| 精品亚洲免费视频| 91超碰在线免费观看| 丰满人妻妇伦又伦精品国产 | 国产精品815.cc红桃| 欧洲grand老妇人| 久久精品亚洲热| 青青操国产视频| 99国产精品视频免费观看一公开 | 欧美极品第一页| 亚洲国产成人精品激情在线| 日日嗨av一区二区三区四区| 国产主播喷水一区二区| 可以免费观看的毛片| 91欧美激情一区二区三区成人| 日本一区二区精品| 国产在线激情视频| 黄色成人av网| 日本国产一级片| 国产主播性色av福利精品一区| 亚洲精品一区二区网址| 日日碰狠狠添天天爽| 在线欧美三区| 国产欧美日韩免费| 俄罗斯嫩小性bbwbbw| 国产视频一区不卡| 激情六月天婷婷| 欧美国产日韩电影| 精品国产91洋老外米糕| 91资源在线播放| 激情综合久久| 成人激情视频小说免费下载| 无码精品视频一区二区三区| 中日韩av电影| 久久精品视频16| 国产精品一区二区精品| 精品亚洲男同gayvideo网站| 男人av资源站| 亚洲中字黄色| 亚洲综合最新在线| 婷婷成人激情| 色噜噜狠狠色综合中国 | 92精品国产成人观看免费| 亚洲第一综合| 小视频免费在线观看| 欧美一区二区三区四区久久| www.中文字幕av| 国产精品a级| 国产在线视频一区| 黄色av网址在线免费观看| 一区二区三区.www| 精品国产鲁一鲁一区二区三区| 女人丝袜激情亚洲| 久久久久在线观看| 午夜精品久久久久久久96蜜桃| 欧美激情一区二区三区全黄| 欧美老熟妇喷水| 国语一区二区三区| 欧美激情精品久久久久久免费印度| 依依成人在线视频| 国产三级精品视频| 国产一区亚洲二区三区| 日本成人7777| 午夜精品一区二区三区av| 国产人妖一区二区| 国产精品成人免费在线| 亚洲黄色a v| 精品国产一区二区三区av片| 欧美与黑人午夜性猛交久久久| 亚洲精品国产手机| 一区二区三区视频在线观看| 精品亚洲视频在线| 国产精品99视频| 国产精品免费久久久久影院| 国产视频第一页在线观看| 欧美性猛交xxxx富婆| a天堂视频在线观看| 亚洲视频精品| 国产精品日韩二区| 91美女精品| 日韩精品视频在线免费观看| 日本一级黄色大片| 91片在线免费观看| 国产福利影院在线观看| 日韩av在线播放网址| 国产精品美女主播| 美女av在线播放| 欧美一级视频精品观看| 国产真人真事毛片| 97se亚洲国产综合自在线| 日韩欧美xxxx| 成人女性视频| 成人中心免费视频| 欧美性猛片xxxxx免费中国| 日韩免费看网站| 免费一级特黄特色大片| 91丨porny丨户外露出| 18禁男女爽爽爽午夜网站免费| 日韩在线你懂的| 国产精品久久久久99| 91ph在线| 日韩欧美一级片| 国产微拍精品一区| 日本一区二区三区四区在线视频 | av综合网页| 亚洲**2019国产| 国产一级免费在线观看| 欧美日韩亚洲综合一区二区三区| 手机在线免费看片| 不卡在线视频中文字幕| 99蜜桃臀久久久欧美精品网站| 国产99久久| 91夜夜揉人人捏人人添红杏| 91九色在线看| 一区二区欧美久久| xxxx国产精品| 色欧美片视频在线观看| 看免费黄色录像| 久久夜色精品一区| 超碰在线超碰在线| 久久久久久黄| 在线观看av的网址| 国内成人精品| 草莓视频一区| 97精品国产综合久久久动漫日韩 | 香蕉污视频在线观看| 一区视频在线播放| 三叶草欧洲码在线| 国产中文字幕一区| 精品免费国产一区二区| 亚洲婷婷免费| 在线观看成人av电影| 另类ts人妖一区二区三区| 91久久国产精品| 在线观看欧美日韩电影| 欧美日产国产成人免费图片| 国产系列在线观看| 亚洲大胆人体视频| 国产乱人乱偷精品视频| 色综合久久综合网欧美综合网| 极品久久久久久| 国产精品沙发午睡系列990531| 亚洲欧美日韩偷拍| 国产一区二区网址| 欧美午夜aaaaaa免费视频| 在线日韩中文| 国产精品igao激情视频| 久久在线视频| 日本高清视频一区二区三区| 看全色黄大色大片免费久久久| 亚洲一区二区三区777| 国产精品久久亚洲不卡| 91成人性视频| 91桃色在线| 欧美国产视频日韩| 污污网站在线看| 久久综合九色九九| 午夜精品一区| 中文字幕国产精品| 国产亚洲依依| 亚洲欧美日韩久久久久久| 婷婷丁香花五月天| 亚洲国产精品悠悠久久琪琪| 性一交一乱一精一晶| 欧美一区二区视频在线观看2020| 一级黄色大片免费观看| 欧美在线你懂的| 69国产精品视频免费观看| 黄色一区二区在线| 日韩男人的天堂| 午夜视黄欧洲亚洲| 五月天综合在线| 午夜国产精品一区| 欧美激情亚洲综合| 欧美色欧美亚洲高清在线视频| 女人十八岁毛片| 欧美日韩一区二区在线| 五月婷婷中文字幕| 色哟哟国产精品免费观看| 久久99国产综合精品免费| 色婷婷综合久色| 中文字幕观看视频| 精品视频在线免费看| 在线观看色网站| 欧美一级国产精品| 欧美自拍偷拍一区二区| 亚洲国产免费av| 国产系列在线观看| 日韩亚洲欧美中文在线| 97影院秋霞午夜在线观看| 九九精品视频在线| 麻豆mv在线看| 国产成人欧美在线观看| 国产激情欧美| 91视频婷婷| 欧美激情极品| 色大师av一区二区三区| 五月开心六月丁香综合色啪| 91精品国产毛片武则天| 亚洲精品视频啊美女在线直播| 欧美日韩国产精品激情在线播放| 丝袜美腿亚洲色图| 午夜影院免费版| 99久久精品免费看国产| 91成年人网站| 亚洲免费观看高清| 日韩精品1区2区| 欧美久久一二区| 天堂在线中文网| 在线观看日韩专区| 欧美亚洲天堂| 国产精品久久在线观看| 日本伊人久久| 欧美高清视频一区| 亚洲深深色噜噜狠狠爱网站| 狠狠干 狠狠操| 美女视频黄 久久| 日批在线观看视频| 国产精品另类一区| 国产性70yerg老太| 日本韩国欧美一区| 国产欧美第一页| 日韩av中文在线| 国产精品久久久久久福利| 欧美性做爰毛片| 日韩精品成人| 日韩视频在线观看国产| 在线精品一区| 黄色三级视频在线播放| 26uuu精品一区二区三区四区在线| 你懂得视频在线观看| 亚洲va韩国va欧美va| 亚洲天堂网在线观看视频| 日韩风俗一区 二区| a在线免费观看| 国产精品视频在线观看| 香蕉久久99| 女人帮男人橹视频播放| 久久99国产精品久久99果冻传媒| a视频免费观看| 一区二区三区欧美激情| 中文字幕在线观看你懂的| 亚洲精品二三区| 青草视频在线免费直播 | 韩国一区二区av| 成人a区在线观看| 男人与禽猛交狂配| 欧美性受xxxx黑人xyx性爽| 婷婷开心激情网| 国内免费精品永久在线视频| 国产精品美女久久久久人| 日本精品一区二区三区不卡无字幕| 亚洲天堂成人| 中文字幕亚洲日本| 综合分类小说区另类春色亚洲小说欧美| 黄色污污网站在线观看| 日韩av中文字幕在线播放| 538在线视频| 俄罗斯精品一区二区| 中文字幕乱码亚洲无线精品一区 | 国产高清av在线播放| 国产91综合一区在线观看| 手机av在线看| 在线播放中文字幕一区| 性开放的欧美大片| 国产精品欧美在线| 青草国产精品| 国产一伦一伦一伦| 中文字幕永久在线不卡| 91九色蝌蚪91por成人| 中文字幕精品久久| 国产福利亚洲| 国产对白在线播放| 国产一区二区三区综合| 男女做暖暖视频| 日韩欧美中文字幕公布| 99热国产在线| 国产中文一区二区| 亚洲视频成人| 日韩在线免费观看av| 在线观看视频一区二区欧美日韩| 黄色片免费在线| 国产精品麻豆va在线播放| 日韩在线精品| 三日本三级少妇三级99| 亚洲精品欧美专区| 黄色美女一级片| 91tv亚洲精品香蕉国产一区7ujn| 日本成人a网站| 在线免费观看av的网站| 亚洲欧美视频一区| 后进极品白嫩翘臀在线视频| 欧美一区二区三区精品电影| 国产精品中文字幕亚洲欧美| 亚洲天堂2018av| 亚洲一区在线播放| 天堂在线免费av| 欧美最猛性xxxxx亚洲精品| 欧美精品一区二区三区中文字幕| 亚洲成人天堂网| 亚洲一区二区偷拍精品| 欧美女子与性| 亚洲伊人一本大道中文字幕| 亚洲经典三级| 手机免费观看av| 日韩精品一区二区在线| 高潮一区二区| 中国黄色录像片| 99精品久久久久久| 中文字幕 视频一区| 久久久久久这里只有精品| 国产一区二区三区91| 欧美视频亚洲图片| 欧美午夜精品久久久久久久| 日韩免费网站| 精品国产一区二区三区日日嗨| 日本va欧美va瓶| 国产亚洲精品码| 日韩在线小视频| 欧美一性一交| 三日本三级少妇三级99| 色综合中文字幕| 色婷婷av在线| 日韩精品欧美一区二区三区| 国产大陆精品国产| 做爰无遮挡三级| 51视频国产精品一区二区| 天天做天天爱天天爽综合网| 国产男女猛烈无遮挡a片漫画 | 日本中文字幕有码|