나는 bash 쉘을 사용하고 있습니다. 각 행의 토큰이 쉼표로 구분된 CSV 파일이 있습니다. 두 번째와 세 번째 열을 가져와서 새 문자열(SQL 문)을 만들고 싶습니다. 나는 이것을 달성하기 위해 awk를 사용할 수 있다고 생각해서 시도했습니다 ...
localhost:mydir davea$ awk -F ',' -v OFS=',' "REPLACE INTO my_table (ID, NAME, HOURS) VALUES ('$2', '$2', '$3');" types.csv
awk: syntax error at source line 1
context is
REPLACE INTO my_table >>> (ID, <<<
awk: bailing out at source line 1
하지만 보시다시피 오류가 발생합니다. 뭔가 빠졌나요? CSV 파일의 각 행에서 새 문자열을 구성하는 방법은 무엇입니까?
답변1
awk -F ',' '{
printf("REPLACE INTO my_table (ID, NAME, HOURS) VALUES ('\''%s'\'', '\''%s'\'', '\''%s'\'');\n", $2, $2, $3)
}' types.csv
답변2
작은따옴표로 묶인 문자열 안에 작은따옴표를 넣는 것은 정말 지루합니다. 여기서는 awk 변수 "q"에 작은따옴표를 전달합니다. 나도 돌보려고 노력 중이야SQL 주입.
awk -F ',' -v q="'" '
{
for (i=1; i<=NF; i++) gsub(q, q q, $i)
print "REPLACE INTO my_table (ID, NAME, HOURS) VALUES (" q $1 q "," q $2 q "," q $3 q");"
}
' <<END
foo,bar,Robert');DROP TABLE students;--
END
REPLACE INTO my_table (ID, NAME, HOURS) VALUES ('foo','bar','Robert'');DROP TABLE students;--');
답변3
아마도 가장 효율적인 솔루션은 아니지만 작동해야 합니다.
awk -F, '{print "REPLACE INTO my_table (ID, NAME, HOURS) VALUES (\x27"$2"\x27,\x27"$2"\x27,\x27"$3"\x27);"}' types.csv